切换其中的复选框时,如何获取 QTreeWidget 项目的文本?

问题描述

我制作了一个 QTreeWidget,它有很多行,每行有一个文本项和一个复选框。当复选框被切换时,如何获取文本?我知道我可以使用 currentItem() 来获取当前选择的 TreeWidgetItem,但不一定选择该行。而且我无法使用 QTreeWidget 的 itemClicked/itempressed 信号,因为当单击其中的复选框小部件时,它们似乎不会发出。

from pyside2 import QtWidgets

class TestUI(QtWidgets.QDialog):
    def __init__(self):
        super(TestUI,self).__init__()
        self.tree = QtWidgets.QTreeWidget()
        self.tree.setHeaderLabels(('text','checkBox'))
        for x in range(0,3):
            item = QtWidgets.QTreeWidgetItem(self.tree)
            item.setText(0,str(x))
            checkBox = QtWidgets.QCheckBox(parent=self.tree)
            checkBox.stateChanged.connect(self.checkBox_toggled)
            self.tree.setItemWidget(item,1,checkBox)
        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.tree)
    
    def checkBox_toggled(self):
        print 'The text of the checkBox TreeWidgetItem is...'
        print None

if __name__ == "__main__":
    try:
        ui.deleteLater()
    except:
        pass
    ui = TestUI()
    ui.show()

解决方法

解决方案涉及获取 QCheckBox 所属的 QTreeWidgetItem,因此可能的解决方案是使用按下的 QCheckbox 的位置,因为它是视口的子项,因此可以使用 indexAt() 方法获取该项目。要在插槽中获取 QCheckbox,您可以使用 sender() 方法:

class TestUI(QtWidgets.QDialog):
    def __init__(self):
        super(TestUI,self).__init__()
        self.tree = QtWidgets.QTreeWidget()
        self.tree.setHeaderLabels(("text","checkbox"))
        for x in range(0,3):
            item = QtWidgets.QTreeWidgetItem(self.tree)
            item.setText(0,str(x))
            checkbox = QtWidgets.QCheckBox()
            checkbox.stateChanged.connect(self.checkbox_toggled)
            self.tree.setItemWidget(item,1,checkbox)
        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.tree)

    def checkbox_toggled(self):
        checkbox = self.sender()
        print("sender: {}".format(checkbox))
        if checkbox is None:
            return
        item = self.tree.itemAt(checkbox.pos())
        if item is not None:
            print("The text of the checkbox TreeWidgetItem is {}".format(item.text(0)))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...