当一个复选框被切换时,如何获取 QTreeWidget 项目的文本?

Posted

技术标签:

【中文标题】当一个复选框被切换时,如何获取 QTreeWidget 项目的文本?【英文标题】:How to get QTreeWidget item's text, when a checkbox within is toggled? 【发布时间】:2021-04-07 06:49:43 【问题描述】:

我制作了一个 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()

【问题讨论】:

【参考方案1】:

解决方案涉及获取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)))

【讨论】:

以上是关于当一个复选框被切换时,如何获取 QTreeWidget 项目的文本?的主要内容,如果未能解决你的问题,请参考以下文章

引导表如何隐藏,当使用 javascript 切换可见时,它无法正确显示

如何获取切换类型复选框的值

未选中特定复选框时,反应切换选择字段未删除

单击功能后在表格中切换复选框

点击时复选框 UIButton 标题不切换

反应复选框。切换复选框时状态迟到