如何实现itemChecked和itemUnchecked信号,QTreeWidget PyQt4中

2019-07-04 08:39发布

哪里有信号itemChecked和itemUncheсked在QTreeWidget ?

Qt Signals: (quote from PyQt4 QTreeWidget documentation page)

void currentItemChanged (QTreeWidgetItem *,QTreeWidgetItem *)
void itemActivated (QTreeWidgetItem *,int)
void itemChanged (QTreeWidgetItem *,int)
void itemClicked (QTreeWidgetItem *,int)
void itemCollapsed (QTreeWidgetItem *)
void itemDoubleClicked (QTreeWidgetItem *,int)
void itemEntered (QTreeWidgetItem *,int)
void itemExpanded (QTreeWidgetItem *)
void itemPressed (QTreeWidgetItem *,int)
void itemSelectionChanged ()

在当前时刻我解决了它是这样的:

self.treeWidget.itemClicked.connect (self.handle)

def handle (item, column): 
    print 'emitted!', item.text(column)
    if item.checkState(column) == QtCore.Qt.Checked:
        # there are a lot of my functions inside which work with item data
        self.handleChecked(item, column)
    elif item.checkState(column) == QtCore.Qt.Unchecked:
        self.handleUnchecked(item, column)

但是,这对我来说是坏的解决方案,因为itemClicked在一个真正的很多情况下发出的。 它发出的左/右鼠标点击的项目文本,这是绝对不必要(我有内self.handleChecked重功能,并在上下文菜单中打开这些不必要的调用是非常糟糕)的情况。

嗯,我还试图用itemChanged :

self.treeWidget.itemChanged.connect (self.handle)

但这样一来情况更糟! self.handle功能自称递归超越无限,因为self.handleChecked改变项数据中我的功能,这一信号连连发出。 另外,我需要信号发出只能在项目复选框切换。

谁能告诉我,我在做什么错?

Answer 1:

要使用时避免递归问题itemChanged信号,尝试暂时阻塞信号 ,直到处理程序完成:

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

你的问题的另一部分被问及发光,只有当一个项目被选中的信号。

这样做的一个方法是继承QTreeWidgetItem并重新实现它的使用setData函数:

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


文章来源: How to implement itemChecked and itemUnchecked signals for QTreeWidget in PyQt4?