Dialog als Delegate - wie Daten im Model speichern?

Alles rund um die Programmierung mit Qt
Antworten
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Dialog als Delegate - wie Daten im Model speichern?

Beitrag von dhcase »

Hallo,

ich habe ein auf dem Simple Dom Model Tutorail basierendes Model, das View ist ein QTreeView. Die Daten (verschiedene Attribute eines XML-Tags) sollen in einem Dialog bearbeitet werden können, also habe ich ein QDialog als Delegate erstellt. Die Daten können mittels einer ComboBox und eines LineEdit bearbeitet werden - das funktioniert auch, nur das Speichern im Model funktioniert nicht, irgenwie verstehe ich das Prinzip nicht so richtig. Wenn ich in dem Dialog auf OK klicke, dann sollen die Daten in das Model geschrieben werden, gibt es ein Signal dafür, commitData() im Delegate funktioniert nicht.

Meine zweite Frage ist, wie kann ich das Delegate über ein Icon in der ToolBar aufrufen und nicht nur über einen Doppelklick? Bis jetzt habe ich folgendes:

Code: Alles auswählen

QStyleOptionViewItem *option = new QStyleOptionViewItem;
option->initFrom(this);
editDelegate->createEditor(this, *option, view->currentIndex());
aber der Dialog öffnet sich nicht, liegt wahrscheinlich an dem QStyleOptionViewItem, aber so recht weiss ich damit nichts anzufangen, bin neu in Qt und die Doku hilft auch nicht immer so richtig weiter.

Danke schonmal für eure Antworten!
D.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Moin!
Die Daten können mittels einer ComboBox und eines LineEdit bearbeitet werden
Irgendwie ist mir nicht ganz klar geworden, was Du erreichen willst. Ein Delegate dient doch dazu, genau ein Item (also z.B. eine Zelle in einer Tabelle) zu bearbeiten. Dazu kann eine Combobox oder ein LineEdit verwendet werden. Das Delegate wird von QItemDelegate abgeleitet und die Methoden setEditorData() und setModelData() sorgen für die Belegung des Editor-Widgets und schreiben die Daten in das Model. Wozu ein Dialog mit mehreren Eingabe-Elementen für einen Wert?
wie kann ich das Delegate über ein Icon in der ToolBar aufrufen und nicht nur über einen Doppelklick?
Wenn die Bearbeitung der Einträge über ein Icon in der Werkzeugleiste erfolgen soll, würde ich dafür gar nicht auf Delegates zurückgreifen, sondern folgenden Weg gehen:

- über die Methode currrentIndex() des Models den Index des selektierten Eintrags holen
- die Eingabefelder und Auswahllisten des Dialogs mit den Daten füllen, auf die der Index verweist
- den Dialog mit der exec() Methode anzeigen
- Nach dem Schließen des Dialogs die neuen Werte mit der setData() Methode des Models in das entsprechende Model schreiben

Gruß Michael
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Irgendwie ist mir nicht ganz klar geworden, was Du erreichen willst. Ein Delegate dient doch dazu, genau ein Item (also z.B. eine Zelle in einer Tabelle) zu bearbeiten. Dazu kann eine Combobox oder ein LineEdit verwendet werden.
Ich dachte, dass durch die Delegates alle Bearbeitungsaufgaben erledigt werden sollen, und man nicht nur z.B. eine Zelle bearbeiten kann. Vielleicht habe ich da die Qt-Doku aber falsch verstanden, v.a. da dort auch immer nur von einer Combobox oder einem Lineedit die Rede ist - und nur eine Zelle bearbeitet wird.
Das Delegate wird von QItemDelegate abgeleitet und die Methoden setEditorData() und setModelData() sorgen für die Belegung des Editor-Widgets und schreiben die Daten in das Model. Wozu ein Dialog mit mehreren Eingabe-Elementen für einen Wert?
Ich möchte mehrere Attribute eines XML-Elements in einem Dialogfenster bearbeiten können, zusätzlich soll in dem Dialog noch ein kleiner Hilfetext zum entsprechenden Eintag angezeigt werden. In createEditor() habe ich den Code für das Dialogfenster, setEditorData() und setModelData() funktionieren soweit auch, aber beim klicken auf OK passiert halt nichts, nur wenn ich den Dialog schliesse und irgenwo in den View klicke werden die Werte geändert.
Wenn die Bearbeitung der Einträge über ein Icon in der Werkzeugleiste erfolgen soll, würde ich dafür gar nicht auf Delegates zurückgreifen, sondern folgenden Weg gehen:

- über die Methode currrentIndex() des Models den Index des selektierten Eintrags holen
- die Eingabefelder und Auswahllisten des Dialogs mit den Daten füllen, auf die der Index verweist
- den Dialog mit der exec() Methode anzeigen
- Nach dem Schließen des Dialogs die neuen Werte mit der setData() Methode des Models in das entsprechende Model schreiben
So werde ich es wohl mal versuchen, ist auf jeden Fall ein guter Vorschlag! Über die Toolbar kann ich den Dialog so öffnen, wie geht das denn über einen Doppelklick auf den entsprechenden Eintag?

Gruss,
D.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

wie geht das denn über einen Doppelklick auf den entsprechenden Eintag?
Die Klasse QTreeView erbt von QAbstractItemView das Signal doubleClicked ( const QModelIndex & index ). Damit bekommst Du auch gleich den Index, der auf das aktuell selektierte Item verweist. Dieses Signal verbindest Du mit einem entsprechenden Slot. Dort kannst Du über die Methode index.row() die selektierte Zeile ermitteln und dann das entsprechende Dialogfenster anzeigen.

Gruß Michael
Antworten