Seite 1 von 1

QListView editierfunktion abschalten

Verfasst: 11. Januar 2011 10:28
von annica
Hallo,

ich habe eine QListView mit ein paar Elementen drin. Wenn ich auf ein Element doppelklicke will ich ein "Event" auslösen (ich weiß nicht ob das das richtige wort ist) und nicht dass ich den eintrag editieren kann.

Dies ist mein code:

Code: Alles auswählen

QString text = "test 1,test 2,test 3";
        QStringList liste = text.split(",");
        this->model.setStringList(liste);
        this->ui->listView_xp->setModel(& this->model);
        this->ui->listView_xp->setVisible(true);
kann mir jemand helfen bitte? wenn es möglich wäre evtl n codeschnipsel, da ich auf dem c++ gebiet nicht so fit bin :)

Verfasst: 11. Januar 2011 10:55
von Exasperation
Eine QListView hat sogenannte EditTriggers, die bestimmen, wann ein Element editierbar wird. Diese Trigger kannst du selber verändern.

--> Qt Doku: EditTriggers

Schau dir an, welche Trigger es gibt und setze die, die du aktiv haben möchtest. Wenn du den Trigger QAbstractItemView::DoubleClicked weg lässt, lassen sich die Items nicht mehr durch einen Doppelklick editieren.

Verfasst: 11. Januar 2011 11:14
von annica
ok das sehe ich mir an. und wie bewerkstellige ich das dann dass ich wenn ich n doppelklick drauf mache ich n bestimmtes event auslöse? muss ich da nicht so ein connect machen?

danke schonmal

Verfasst: 11. Januar 2011 11:32
von annica
das funktioniert schonmal mit dem ausstellen edierfunktion. Für jemanden der es mal braucht:

Code: Alles auswählen

this->ui->listView_xp->setEditTriggers(QAbstractItemView::NoEditTriggers);
wenn mir jetzt noch jemand helfen kann bei dem anderen problem :(

Verfasst: 11. Januar 2011 11:52
von Exasperation
Richtig, dadurch hast du alle Möglichkeiten die Elemente in der Liste zu bearbeiten deaktiviert.

Also zum Einen solltest du dich auf jeden Fall mit den wichtigsten Prinzipien von Qt vertraut machen, wenn du schon mit Qt arbeitest. Das Stichwort hier ist das Signal-Slot-Konzept, wie du richtig erkannt hast.

Signals and Slots

Da ich jetzt nicht alles schon fertig vorlegen möchte würde ich einfach sagen du schaust dir an wie das mit den Signalen und Slots funktioniert, ist ja im Prinzip ganz einfach. Es gibt immer einen Sender, der ein Signal hat und einen Empfänger, der einen Slot hat. Diese werden über das connect verbunden. Sender- und Empfängerobjekt können selbstverständlich das selbe sein.

Wichtig ist, zu wissen, welches, Signal du verbinden musst. Außerdem musst du die Funktion die bei Auslösen des Signals aufgerufen werden soll als Slot deklarieren. In der offiziellen Doku sind die Signale der Klassen separat aufgeführt, da schaut man immer als erstes nach. Außerdem schaut man sich danach die Signale der Basisklasse an. In deinem Fall ist das für die QListView das Signal QAbstractItemView::doubleClicked ( const QModelIndex & index ).

Kannst ja mal versuchen ein entsprechendes connect zu erstellen.

Alternativ lässt sich das auch über Events bewerkstelligen.

Verfasst: 11. Januar 2011 12:06
von annica
Ja damit habe ich schon gearbeitet. Ich habe nur gerade noch ein verständnisproblem...vielleicht kannst du mir ja auch dabei helfen, das wär echt super!
ich habe also folgende verbindung zwischen meiner listview und der funktion hergestellt:

Code: Alles auswählen

connect(this->ui->listView_xf, SIGNAL(clicked(const QModelIndex &)), this, SLOT(ausgewaehlt_xf()));
doch nun ist es egal auf welches element ich in der liste klicke...wie kann ich dies separieren, bzw wie kann ich dann abfragen welches element geklickt wurde? eigtl müsste der sender ja nicht die ganze liste sein, sondern der einzelne eintrag?[/code]

Verfasst: 11. Januar 2011 12:21
von Exasperation
Doch doch, das Signal doubleClicked ( const QModelIndex & index ) gehört zu QAbstractItemView (die Basisklasse von QListView). Und wenn du die Doku gelesen hättest dazu, hättest du dort gefunden:
The item the mouse was double-clicked on is specified by index.
:p


An deinem Beispiel sehe ich ja auch sofort, dass ich mit meinemHinweis, sich nochmal genau mit diesem Prinzip zu beschäftigen, Recht hatte. Wenn bei einem connect Parameter übergeben werden, so müssen das Signal und der Slot die selben Übergabeparameter besitzen, sonst findet der connect nicht statt.

Zum Beispiel so:

Code: Alles auswählen

connect(m_parameter_view, SIGNAL( doubleClicked(const QModelIndex&) ), this, SLOT( on_double_clicked(const QModelIndex&) ) );
Das Signal hat von Haus aus als Parameter ne Referenz auf den QModelIndex auf den doppelt geklickt wurde. Somit muss der Slot auf den konnektiert wird zwingend den selben Parameter besitzen, damit der connect vom meta-object-compiler richtig verarbeitet und zu c++ code umgewandelt wird.

In deinem Fall solltest du also deinen Slot "ausgewählt_xf()" um den Parameter erweitern.

Code: Alles auswählen

connect(this->ui->listView_xf, SIGNAL(clicked(const QModelIndex &)), this, SLOT(ausgewaehlt_xf(const QModelIndex &)));

void my_class::ausgewaehlt_xf(const QModelIndex &)
{
	// hier steht dir jetzt der Index zur Verfügung auf den doppelt geklickt wurde
}
Bei der Arbeit mit Qt: Doku lesen, Doku lesen, Doku lesen. (:

... was natürlich nicht bedeutet, dass hier niemand helfen will, im Gegenteil. Aber ich finde es wichtiger, den Leuten nicht einfach den fertigen Code hinzuklatschen sondern sie dazu anzuhalten selbstständig in die Doku zu schauen und dabei zu lernen. (:

Verfasst: 11. Januar 2011 12:38
von franzf
Exasperation hat geschrieben:Das Signal hat von Haus aus als Parameter ne Referenz auf den QModelIndex auf den doppelt geklickt wurde. Somit muss der Slot auf den konnektiert wird zwingend den selben Parameter besitzen, damit der connect vom meta-object-compiler richtig verarbeitet und zu c++ code umgewandelt wird.
Falsch :P Der SLOT darf weniger Parameter haben als das SIGNAL (Reduzierung von hinten her), weswegen prinzipiell sein connect auch funktioniert.
Das Problem ist aber, dass er ja tatsächlich was mit dem übergebenen Parameter (dem ModelIndex) anstellen will - dafür ist es nun notwendig, dem SLOT auch den passenden Parameter zu verpassen.

Verfasst: 11. Januar 2011 12:44
von Exasperation
Ahh okay, also folgendes würde gehen?

Code: Alles auswählen

connect( my_table_widget, SIGNAL(cellEntered(int, int)), this, SLOT(highlight_entire_row(int)) );
Ah okay, habs grad in der Doku gefunden:
The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)
Danke für die Korrektur!

Verfasst: 11. Januar 2011 12:53
von annica
vielen vielen dank :) es funktioniert :)

und ja, asche auf mein haupt, ich werde mir die doku anschauen :) aber ich bin noch nicht mal ne woche mit c++ beschäftigt und finde dafür bin ich schon weit!