EndEditHint, QModelView nächstes Item automatisch editieren

Alles rund um die Programmierung mit Qt
Antworten
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

EndEditHint, QModelView nächstes Item automatisch editieren

Beitrag von mollitz »

Hi,

Ich habe ein QModelView das ich mithilfe eines QItemDelegates anspreche. Ich hätte gerne, dass wenn ich eine Zelle fertig editiert habe und Enter drücke, die nächste Zeile editiert wird. Dazu existiert in der Doku folgender Text:
The behavior of the spin box could be adjusted to make it more user friendly. In the default event filter supplied by QItemDelegate, if the user hits Return to confirm their choice in the spin box, the delegate commits the value to the model and closes the spin box. We can change this behavior by installing our own event filter on the spin box, and provide editing hints that suit our needs; for example, we might emit closeEditor() with the EditNextItem hint to automatically start editing the next item in the view.
Leider kann ich damit nicht viel anfangen:
Was hab ich zu subclassen, wo installiere ich den eventfilter?
Ich hätte jetzt gedacht ich mache ein qobject mit eventfilter und fange das closeevent ab. Aber dann kann ich nicht für die spinbox(bzw. bei mir combobox) ein Signal emitieren.
Ich wäre also sehr verbunden wenn mir jemand näher erklärt wie die Doku das meint, weil es klingt eigentlich so einfach, aber ich kapiers einfach nicht..

Vielen Dank
ceumern
Beiträge: 28
Registriert: 16. September 2011 11:25

Re: EndEditHint, QModelView nächstes Item automatisch editie

Beitrag von ceumern »

Ich empfehle erstmal das hier genau durchzulesen:

http://doc.trolltech.com/4.6/qobject.ht ... ventFilter

Damit sollte klar sein, was mit dem EventFilter gemeint ist.

Du kannst dann einen EventFilter schreiben, der auf der ComboBox das Drücken der Eingabetaste abfängt und dann ein das Model veranlasst, das nächste Item in der Reihe/Zeile zu editieren.

Der EventFilter sollte natürlich auf der ComboBox installiert werden:

Code: Alles auswählen

comboBox->installEventFilter(eventFilterInstance);
Der Teil mit dem EditNextItem hint bezieht sich hier drauf:

http://doc.trolltech.com/4.6/qabstracti ... loseEditor

Beispiel für das Ganze gibt's hier (zwar python, aber die Vorgehensweise sollte klar sein):
http://www.hardcoded.net/articles/how-t ... havior.htm

Viel Erfolg
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

Re: EndEditHint, QModelView nächstes Item automatisch editie

Beitrag von mollitz »

Hi,

Mit dem Python-Link komm ich klar! Vielen dank dafür. Ich hab noch eine andere Frage zu dem SQL-Item-Model-Zeug aber dazu öffne ich einen anderen Thread, da es nichts mit diesem zu tun hat
mollitz
Beiträge: 81
Registriert: 5. April 2007 10:55

Re: EndEditHint, QModelView nächstes Item automatisch editie

Beitrag von mollitz »

Ich hab mich jetzt nach langer Zeit endlich wieder mit dem Stück Code beschäftigt und festgestellt, dass das Problem an anderer Stelle liegt:
Meine EditingStrategy von meiner QSqlTableModel ist nämlich auf OnFieldChange und dadurch wird nicht das nächste Feld zum Editieren angewählt, wenn ich nach erfolgtem editieren einer Zelle Tab drücke. Schalte ich die EditingStrategy auf einen anderen Wert funktioniert das wunderbar.
Weiß einer woran das liegen könnte?

Gruß,

Moritz

EDIT: Ich habe jetzt nochmal ein kleines Testprojekt etwa wie so geschrieben:

Code: Alles auswählen

QSqlTableModel model;
QTableView view;
model.setTable("tabelle");
model.setEditingStrategy(QSqlTableModel::OnFieldChange);
model.select();
view.setModel(&model);
view.show();
Wenn ich hier eine Zelle editiere und Tab drücke, wird das editieren beendet, die nächste Zeile aber nicht selektioniert. ändere Ich setEditingStrategy auf OnRowChange oder OnManual funktioniert das wunderbar mit dem selektionieren der nächsten Zeile.
Ich habe auch schon einen Workarround a la connect(&model, SIGNAL(dataChanged()), &model, SLOT(submitAll())); was allerdings genau das gleiche Problem hervorrief wie mit setEditingStrategy(OnFieldChange); Kann man das als Qt-Bug sehen, oder ist das "expected behaviour" und Ich muss das selber regeln?

Bitte um Hilfe,

Moritz
Antworten