QTreeWidget上的itemChecked和itemUncheked信号在哪里?
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中的函数更改了项目数据,并且此信号一次又一次发出。另外,我需要仅在项目复选框切换时发出的信号。
有人可以告诉我,我在做什么错吗?
为了避免在使用itemChanged
信号时出现递归问题,请暂时尝试blocking signals,直到处理程序完成:
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))
要完成@ekhumoro的回答,并给出一个简短的答案(不继承QTreeWidgetItem的子类):阻止信号:
self.treeWidget.blockSignals(True)
self.treeWidget.blockSignals(False)
和使用
self.treeWidget.itemChanged
连接到您想要的东西。数据更改时使用信号(内部文本,检查状态等)并在链接到该信号的函数中,验证treeWidget是否已更改为选中状态。