[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