当 qtreewidgetitems 复选框状态改变时触发信号

fire signal when qtreewidgetitems checkbox state changes

我这里有一个简单的例子。我想要发生的是当用户更改 'Checkbox' 的切换状态时,我希望它为 CustomTreeWidgetItem 的属性设置 属性 值。

在这种情况下,每个 CustomTreeWidgetItem 都有一个名为 dataObject 的属性,这是我存储 class 对象系列的地方。 Family 有一个属性 enabled,我希望这个 属性 反映 TreeWidgetItems 复选框的切换状态。

我在网上看了一圈,还没有找到解决办法。大多数答案都是用 C++ 编写的,或者它们会导致错误。您可以通过单击打印按钮来测试结果。它应该反映更改。

这是突出显示的部分。

更新: 链接的问题没有回答我的问题。它不 return 单击复选框的值。

这段代码简单来说是做什么的?我需要修改什么才能将数据对象设置为 True 或 False?目前它 returns 0 或 2。我不确定那是三态还是什么。希望有人能解释这是怎么回事。

if column == 0 and role == 10:

我的自定义树小部件项目具有 属性 dataObject。这是我存储 class 对象 Family 的地方,其中包含 属性 enabled

self.dataObject = None

class Family:
    def __init__(self, name, members=None, data=None):
        self.name = name
        self.enabled = True

希望对您有所帮助。

谢谢

全部代码

# Imports
# ------------------------------------------------------------------------------
import sys
from PySide import QtGui, QtCore

# Class
# ------------------------------------------------------------------------------
class Family:
    def __init__(self, name, members=None, data=None):
        self.name = name
        self.enabled = True


# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):

    def __init__( self, parent, name ):

        ## Init super class ( QtGui.QTreeWidgetItem )
        super( TreeNodeItem, self ).__init__( parent )

        # Column 0 - Text:
        self.setText( 0, name )

        # Tree Node Data
        self.dataObject = None

    def setData(self, column, role, value):
        if column == 0 and role == 10:
            self.dataObject.enabled = value

        super(TreeNodeItem, self).setData(column, role, value)


# Variables
# ------------------------------------------------------------------------------
Families = [
    Family("Smith"), 
    Family("Michaels"),
    Family("Wislon"), 
    Family("Yoder")
]

# Main
# ------------------------------------------------------------------------------
class Example(QtGui.QWidget):

    def __init__(self,):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        # formatting
        self.resize(400, 400)
        self.setWindowTitle("Example")

        # widgets
        self.printData = QtGui.QPushButton("Print Families Data")
        self.itemList = QtGui.QTreeWidget()
        self.itemList.setItemsExpandable(True)
        self.itemList.setAnimated(True)
        self.itemList.setItemsExpandable(True)
        self.itemList.setColumnCount(1)
        self.itemList.setHeaderLabels(['Families'])

        # signals
        self.printData.clicked.connect(self.PrintAllData)

        # layout - row/column/verticalpan/horizontalspan
        self.mainLayout = QtGui.QGridLayout(self)
        self.mainLayout.addWidget(self.itemList,0,0)
        self.mainLayout.addWidget(self.printData,1,0)

        self.center()
        self.show()
        self.UpdateFamilies()

    def center(self):

        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def PrintAllData(self):
        for f in Families:
            print f.name, f.enabled

    def UpdateFamilies(self):
        treeWidget = self.itemList
        treeWidget.clear()

        for f in Families:
            # Add Families
            treeNode = TreeNodeItem(treeWidget, f.name)
            # assign family class object to dataObject attr of treenode
            treeNode.dataObject = f
            treeNode.setCheckState(0, QtCore.Qt.Checked)

# Main
# ------------------------------------------------------------------------------
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

答案在链接的问题中(尽管在 C++ 中)Is it possible to create a signal for when a QTreeWidgetItem checkbox is toggled?

简短回答 - 不,该复选框似乎没有信号。有两种方法可以解决此问题:

1) 如链接问题中所述,您可以实现 SetData 方法并同时更新您的数据:

# Custom Tree Widget
# ------------------------------------------------------------------------------
class TreeNodeItem( QtGui.QTreeWidgetItem ):

    def __init__( self, parent, name ):

        ## Init super class ( QtGui.QTreeWidgetItem )
        super( TreeNodeItem, self ).__init__( parent )

        # Column 0 - Text:
        self.setText( 0, name )

        # Tree Node Data
        self.dataObject = None

    def setData(self, column, role, value):
        if column == 0 and role == 10:
            self.dataObject.enabled = value

        super(TreeNodeItem, self).setData(column, role, value)

2) 您也可以尝试手动创建一个复选框,连接它的信号并使用 QTreeWidget.setItemWidgem

将其添加到 TreeNodeItem