【发布时间】:2012-11-19 15:58:30
【问题描述】:
QTreeWidget 上的 itemChecked 和 itemUncheсked 信号在哪里?
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信号绝对是正确的选择。 “self.handle 递归调用”是什么意思?究竟什么是“不可接受的”? -
@ekhumoro,我更新了帖子。
-
我已经用一种可能的解决方案更新了我的答案,仅在检查状态发生变化时才发出信号,您可能会发现这比阻塞信号更好。
标签: qt pyqt pyqt4 signals-slots qtreewidget