2015-07-10 159 views
1

我試圖創建一個樹小部件,實質上將允許用戶查看各種數據故障,並可以選擇刪除某些項目。爲了做到這一點,我希望有與每個頂級項目和每個孩子關聯的複選框,以便用戶可以選擇刪除哪些頂級項目(以及因此頂級項目的所有孩子)。或者刪除哪些特定的孩子。爲了讓您更好地瞭解我創建其中[x]表示選中的複選框和[]表示空複選框的例子:PyQt樹小工具,添加複選框動態刪除

>Beverages Allowed in Stadium [ ] 
    Soda      [ ] 
    Water      [ ] 
    Tea      [ ] 
    Spirits     [X] 
    Ale      [ ] 

>Tickets      [X] 
    Row A      [X] 
    Row B      [X] 
    Row C      [X] 
    Lawn      [X] 

任何建議如何實現這一點?我不知道這是否會造成困難,但我已經爲複選框分配了一個單獨的列。

回答

9

除了answer你提供,則可以通過使用ItemIsTristate標誌上的父元素簡化邏輯。

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

def main(): 
    app  = QApplication (sys.argv) 
    tree = QTreeWidget() 
    headerItem = QTreeWidgetItem() 
    item = QTreeWidgetItem() 

    for i in xrange(3): 
     parent = QTreeWidgetItem(tree) 
     parent.setText(0, "Parent {}".format(i)) 
     parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) 
     for x in xrange(5): 
      child = QTreeWidgetItem(parent) 
      child.setFlags(child.flags() | Qt.ItemIsUserCheckable) 
      child.setText(0, "Child {}".format(x)) 
      child.setCheckState(0, Qt.Unchecked) 
    tree.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

三個代碼最重要的線路有:

parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) 

這條設立的父元素是一個三個態複選框。

child.setFlags(child.flags() | Qt.ItemIsUserCheckable) 
child.setCheckState(0, Qt.Unchecked) 

這些設置孩子是可選擇的,並將默認設置爲未選中。如果孩子的複選框沒有給出狀態,複選框元素不會出現。


上面的代碼建立了一個非常簡單的樹。

Simple Tree

不過,如果我檢查父元素上的複選框,所有的孩子都自動選擇:

Parent Selected

如果,我要取消選擇一個孩子,父母進入部分選中(三態):

TriState

如果所有孩子都未被選中,父母會自動取消選中。如果父母未被選中,則所有孩子也會自動取消選擇。

+0

偉大的回答很好的解釋。我會嘗試實施並回復你。謝謝你的幫助安迪。 – sudobangbang

+0

這似乎工作得很好,但是,而不是得到一個很好的填充框,我的箱子似乎只是有一個水平的破折號,或者如果我再次點擊它顯示一個複選標記。這是正常的嗎?無論如何,我可以禁用固體破折號或修正它來填充整個框中,如你的例子? – sudobangbang

+1

這取決於你的操作系統和widget的風格。關於[這裏]有更多文檔(http://pyqt.sourceforge.net/Docs/PyQt4/qstyle.html),但可能超出了這個特定問題的範圍。 – Andy

2

QTreeWidgetItem實際上有一個內置複選框,您可以很容易地使用。

例如:

item = QTreeWidgetItem(self.treeWidget) 

item.setCheckState(0, QtCore.Qt.Unchecked) 
+0

沒錯,但您的解決方案不包括的分級結構,其中母公司具有對應於它的孩子們的狀態的三態。上面列出的例子確實如此。 – MaVCArt

1

這不是您的問題的答案,而是一旦您擁有它們,如何使用複選框。我從標記爲正確的答案中使用了上面的示例。它的工作,但後來當我試圖找到如何知道哪些複選框被標記,並且我有很多問題。經過大量搜索後,我找到了一個適合我的解決方案,因爲我看到沒有很多文檔,所以我想留下未來的記錄。只要提及我使用了幾個解決方案作爲invisibleRootItem爲了找到父母的孩子,但沒有奏效。

我結束了使用類QTreeWidgetItemIterator與標誌QtGui.QTreeWidgetItemIterator.Checked爲了檢索標記的複選框的文本,並與此,我可以繼續工作。

def vrfs_selected(self): 
    iterator = QtGui.QTreeWidgetItemIterator(self.tree, QtGui.QTreeWidgetItemIterator.Checked) 
    while iterator.value(): 
     item = iterator.value() 
     print (item.text(0))  
     iterator += 1 

的鏈接文檔http://ftp.ics.uci.edu/pub/centos0/ics-custom-build/BUILD/PyQt-x11-gpl-4.7.2/doc/html/qtreewidgetitemiterator.html和示例https://riverbankcomputing.com/pipermail/pyqt/2014-May/034315.html