如何在 PyQt4 中为 QTreeWidget 实现 itemChecked 和 itemUnchecked 信号? [英] How to implement itemChecked and itemUnchecked signals for QTreeWidget in PyQt4?

查看:62
本文介绍了如何在 PyQt4 中为 QTreeWidget 实现 itemChecked 和 itemUnchecked 信号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

QTreeWidget 上的信号 itemChecked 和 itemUnchecked 在哪里?

Where are the signals itemChecked and itemUncheсked on the 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 中有大量函数,并且在打开上下文菜单时不必要地调用它们非常糟糕).

But it's a bad solution for me, because itemClicked emitted in a really lot of cases. It emitted in the case of Left/Right Mouse Clicks on the item text, which is absolutely unnecessary (I have heavy functions within self.handleChecked, and unnecessary calls of them on the context menu opening are pretty lousy).

嗯,我也尝试使用 itemChanged:

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

但是这样情况更糟!self.handle 函数以递归方式调用自己到无穷大,因为我在 self.handleChecked 中的函数会更改项目数据并且此信号一次又一次地发出.另外,我需要仅在项目复选框切换时发出的信号.

but this way situation is even worse! self.handle function calls himself recursively to infinity and beyond, because my functions within self.handleChecked change item data and this signal emits again and again. Also, I need signal which emits only on item checkbox toggling.

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

Can someone tell me, what I'm doing wrong?

推荐答案

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

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)

更新

您问题的另一部分是关于仅在检查项目时发出信号.

The other part of your question asked about emitting a signal only when an item is checked.

一种方法是继承 QTreeWidgetItem 并重新实现它的 setData 功能:

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

这篇关于如何在 PyQt4 中为 QTreeWidget 实现 itemChecked 和 itemUnchecked 信号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆