我正在尝试创建一个树窗口小部件,它基本上允许用户查看各种数据细分,并可以选择删除某些项目。为了做到这一点,我希望有与每个顶级项目和每个子项相关联的复选框,以便用户可以选择要删除的顶级项目(以及该顶级项目的所有子项)。或者删除哪些特定的孩子。为了让您更好地了解我创建了一个示例,其中[x]表示选中的复选框,而[]表示一个空的复选框:
>Beverages Allowed in Stadium [ ]
Soda [ ]
Water [ ]
Tea [ ]
Spirits [X]
Ale [ ]
>Tickets [X]
Row A [X]
Row B [X]
Row C [X]
Lawn [X]
有任何建议如何实现这个?我不知道它是否与困难有所区别,但我为复选框分配了一个单独的列。
答案 0 :(得分:12)
除了您提供的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)
这些将子项设置为可选择,并将默认设置为未选中。如果孩子的复选框没有给出状态,则复选框元素不会出现。
上面的代码构建了一个非常简单的树。
但是,如果我选中父元素上的复选框,则会自动选择所有子项:
如果,我希望取消选择一个孩子,父母进入部分选中(三态):
如果未选中所有子项,则会自动取消选择父项。如果未选择父级,则也会自动取消选择所有子级。
答案 1 :(得分:2)
QTreeWidgetItem
实际上有一个内置的复选框,您可以相当轻松地使用它。
例如:
item = QTreeWidgetItem(self.treeWidget)
item.setCheckState(0, QtCore.Qt.Unchecked)
答案 2 :(得分:1)
这不是您问题的答案,而是如何使用复选框。我使用上面的例子从标记为正确的答案。它工作,但当我试图找到如何知道哪些复选框被标记,我有很多问题。经过大量的搜索,我发现了一个对我有用的解决方案,因为我看到没有很多文档,所以我想留下未来的记录。只是提到我使用了几个解决方案作为invisibleRootItem,以便找到父级的子级,但是没有工作。
我最后使用带有标志QtGui.QTreeWidgetItemIterator.Checked的QTreeWidgetItemIterator类来检索标记的复选框的文本,然后我可以继续工作。
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
答案 3 :(得分:0)
我将@andy的出色示例移植到PyQt5:
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.Qt import Qt
import sys
def main():
app = QtWidgets.QApplication(sys.argv)
tree = QtWidgets.QTreeWidget()
headerItem = QtWidgets.QTreeWidgetItem()
item = QtWidgets.QTreeWidgetItem()
for i in range(3):
parent = QtWidgets.QTreeWidgetItem(tree)
parent.setText(0, "Parent {}".format(i))
parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
for x in range(5):
child = QtWidgets.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()