pyqt  

[PyQt] Problem getting QItemDelegate to work

David Hirschfield
Thu, 24 Apr 2008 12:09:24 -0700

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.


_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt