2015-11-13 964 views
0

我在这里有个简单的例子。我想要发生的是,当用户更改'复选框'的切换状态时,我希望它为CustomTreeWidgetItem的属性设置属性值。当qtreewidgetitems复选框状态发生变化时触发信号

在这种情况下,每个CustomTreeWidgetItem都有一个叫做dataObject的attr,这是我存储我的类对象Family的地方。家庭有一个属性启用我希望此属性反映TreeWidgetItems的复选框的切换状态。

我在网上看了一圈,还没有找到解决方案。大多数答案都在C++中,或者他们造成错误。您可以通过点击打印按钮来测试结果。它应该反映这些变化。

以下是突出显示的位。

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

这段代码是干什么的?我需要修改哪些数据对象为True或False?目前它返回0或2.我不确定这是三态还是什么。希望有人能够解释发生了什么。

if column == 0 and role == 10: 

我的自定义树控件项目有属性dataObject时。这是我存储我的类对象家庭其中有属性启用在其中。

self.dataObject = None 

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

希望有所帮助。

感谢

enter image description here

所有代码

# 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_()) 
+0

我试过他的答案,它并没有阻止任何信号。它仍然解雇额外人员。 – JokerMartini

回答

1

答案是在链接的问题(尽管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)您也可以尝试手动创建一个复选框,连接它的信号,并将其添加到TreeNodeItem使用QTreeWidget.setItemWidgem

+0

当复选框更改时,如何触发设置的数据? – JokerMartini

+0

为什么值会导致0或2?这条线'如果列== 0和角色== 10'是什么意思? – JokerMartini

+0

您不'激发setValue,当用户更改树单元格中的值时,setValue被QT调用。在这种情况下,您将覆盖默认实现,并且当CheckState角色的值发生更改时(http://doc.qt.io/qt-5/qt。html#ItemDataRole-enum)将要设置的值传递给dataObject – FrozenKiwi

相关问题