除了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)
這些設置孩子是可選擇的,並將默認設置爲未選中。如果孩子的複選框沒有給出狀態,複選框元素不會出現。
上面的代碼建立了一個非常簡單的樹。
不過,如果我檢查父元素上的複選框,所有的孩子都自動選擇:
如果,我要取消選擇一個孩子,父母進入部分選中(三態):
如果所有孩子都未被選中,父母會自動取消選中。如果父母未被選中,則所有孩子也會自動取消選擇。
偉大的回答很好的解釋。我會嘗試實施並回復你。謝謝你的幫助安迪。 – sudobangbang
這似乎工作得很好,但是,而不是得到一個很好的填充框,我的箱子似乎只是有一個水平的破折號,或者如果我再次點擊它顯示一個複選標記。這是正常的嗎?無論如何,我可以禁用固體破折號或修正它來填充整個框中,如你的例子? – sudobangbang
這取決於你的操作系統和widget的風格。關於[這裏]有更多文檔(http://pyqt.sourceforge.net/Docs/PyQt4/qstyle.html),但可能超出了這個特定問題的範圍。 – Andy