How to implement itemChecked and itemUnchecked signals for QTreeWidget in PyQt4?
To avoid problems with recursion when using the itemChanged
signal, try temporarily blocking signals until the handler has completed:
def handle(self, item, column):
self.treeWidget.blockSignals(True)
if item.checkState(column) == QtCore.Qt.Checked:
self.handleChecked(item, column)
elif item.checkState(column) == QtCore.Qt.Unchecked:
self.handleUnchecked(item, column)
self.treeWidget.blockSignals(False)
UPDATE
The other part of your question asked about emitting a signal only when an item is checked.
One way to do this would be to subclass QTreeWidgetItem and reimplement it's setData function:
class TreeWidgetItem(QtGui.QTreeWidgetItem):
def setData(self, column, role, value):
state = self.checkState(column)
QtGui.QTreeWidgetItem.setData(self, column, role, value)
if (role == QtCore.Qt.CheckStateRole and
state != self.checkState(column)):
treewidget = self.treeWidget()
if treewidget is not None:
treewidget.itemChecked.emit(self, column)
class Window(QtGui.QTreeWidget):
itemChecked = QtCore.pyqtSignal(object, int)
def __init__(self, rows, columns):
QtGui.QTreeWidget.__init__(self)
self.itemChecked.connect(self.handleItemChecked)
def handleItemChecked(self, item, column):
print 'ItemChecked', int(item.checkState(column))