How to implement itemChecked and itemUnchecked signals for QTreeWidget in PyQt4?

前端 未结 2 864
遇见更好的自我
遇见更好的自我 2020-12-18 04:46

Where are the signals itemChecked and itemUncheсked on the QTreeWidget?

Qt Signals: (quote from PyQt4 QTreeWidget documentation page)

void currentItemChange         


        
2条回答
  •  攒了一身酷
    2020-12-18 05:38

    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))
    

提交回复
热议问题