[PyQt] Problem getting QItemDelegate to work
David Hirschfield
davidh at ilm.com
Thu Apr 24 19:51:01 BST 2008
I have a simple test app which displays a QTableWidget with a custom
QItemDelegate to display the items as buttons, checkboxes and comboboxes.
The widgets are supposed to be editable at all times, so I use:
self.widgetTable.setItem(row, i, tableItem)
self.widgetTable.openPersistentEditor(tableItem)
to add the item and make the editor always visible and ready for
interaction.
I'm not having any trouble setting up the table and having my rows
display properly with the widgets ready for interaction. The problem
comes when I interact with the editor widgets.
My QItemDelegate subclass, called WidgetDelegate, implements the
createEditor(), setEditorData() and setModelData() methods to build the
editor widget, and supposedly to set the editor value when the model
changes, and to set the model when the user interacts with the editor.
createEditor() seems to be working, since my widgets show up in the
table and can be interacted with, but neither setEditorData() nor
setModelData() are ever called when the table widgets are displayed, or
when I interact with the editor widgets.
When creating a checkbox widget as an editor, for example, I connect its
stateChanged() signal to a method in my item delegate which emits the
commitData() signal:
checkboxWidget.connect(checkboxWidget,QtCore.SIGNAL("stateChanged(int)"),delegate.commit)
where delegate.commit() is:
def commit(self, *args):
self.emit(QtCore.SIGNAL("commitData(QWidget *)"),self.sender())
I assumed that the commitData() signal should tell the table to update
the model?
I see the commitData() signal gets sent, if I connect something up to
that signal, it does get emitted any time I interact with one of the
editor widgets. But again, the delegate never seems to call
setModelData() or setEditorData(), so the model is never updated
(connecting my app up to the itemChanged() signal from the table itself
shows that, since it never gets that signal).
So what's the right way to do this? I was trying to convert the "Icons"
example from the Qt site, which is in C++, over to python - specifically
the ImageDelegate class which does mostly what I'm trying to do:
http://doc.trolltech.com/4.3/widgets-icons.html#imagedelegate-class-definition
But it isn't working for me. Am I missing some connections between the
editor widgets and the delegate? Or between the delegate and the table?
Any help appreciated!
-David
--
Presenting:
mediocre nebula.
More information about the PyQt
mailing list