A QItemDelegate that uses my own editor QWidget can fail to update the model
-
wrote on 16 Jan 2011, 10:11 last edited by
I'm using a QTableView and a QSqlRelationalTableModel. I have successfully implemented QItemDelegates that use a QDateTimeEdit and QLineEdit.
In particular if I:
modify the text in the QLineEdit I use for my QItemDelegate
call submitAll() on the model
then QItemDelegate::setModelData() is correctly called. ie the model is updated and the modified text saved to the database.
However, if instead my QItemDelegate editor is a "compound" editor, say a QWidget to which I've added a QLineEdit (rather than just a QLineEdit by itself), then setModelData() isn't called in the above circumstances.
On the other hand if I
navigate away from my "compound" editor or if I press return
call submitAll()
then setModelData() is correctly called.
Any ideas on why my "compound" editor isn't fully working? I presume that if I use a simple editor the model knows that the data in the editor has changed, but if I use a compound editor the necessary events are being blocked.
-
wrote on 15 Feb 2011, 07:16 last edited by
Yes. You know the reason right yourself:)
If you have the custom widget how the Qt will know when the data is changed? You must call commitData().
See void QAbstractItemDelegate::commitData ( QWidget * editor ) function. -
wrote on 15 Feb 2011, 11:35 last edited by
You need a "user property":http://doc.qt.nokia.com/4.7/properties.html in your compound widget, so that the delegate can set and retrieve the data automagically.
See the docs of:
- "QStyledItemDelegate::createEditor() ":http://doc.qt.nokia.com/4.7/qstyleditemdelegate.html#createEditor
- "QStyledItemDelegate::setEditorData() ":http://doc.qt.nokia.com/4.7/qstyleditemdelegate.html#setEditorData
- "QStyledItemDelegate::setModelData() ":http://doc.qt.nokia.com/4.7/qstyleditemdelegate.html#setModelData
-
wrote on 15 Feb 2011, 18:12 last edited by
Darryl: How do I obtain a reference to the editor in order to call ::commitData? The methods in the delegate are all "consts".
Volker: Are you suggesting that I create a user property in my compound widget (ie the editor) to store a reference to the delegate? When and by whom is this property (i) set, (ii) retrieved?
-
wrote on 15 Feb 2011, 18:34 last edited by
Define a property for your compound widget that holds the value the user has entered. Whatever it is - we don't know. Provide a read and a write method and mark it as user property, QStyledItemDelegate will recognize it and use it to set the models value as default for the editor and to retrieve the value the user has entered and store that one in the model. You only will have to return a new instance of your widget in the overwritten method createEditor() of your delegate. See the links provided, they tell you who calls the property.
-
wrote on 16 Feb 2011, 12:06 last edited by
Another simple way could be catch the signal of your compound widget QLineEdit which is a child of QWidget on user update finished and in that slot, you can call commitData(). Qt now must call setModelData() function.