2015-11-13 959 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

相關問題