PyQt树小部件,添加动态rem的复选框

2024-05-19 01:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个树小部件,它基本上允许用户查看数据的各种细分,并可以选择删除某些项。为此,我希望每个顶级项和每个子项都有关联的复选框,以便用户可以选择要删除的顶级项(以及该顶级项的所有子项)。或者删除哪个特定的子项。为了让您更好地了解,我创建了一个示例,其中[x]表示选中的复选框,[]表示空的复选框:

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

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

有什么建议可以实施吗?我不知道这是否会造成困难,但我已经为复选框分配了一个单独的列。


Tags: 数据用户in示例部件顶级复选框row
3条回答

这并不是对你的问题的回答,而是一旦你有了复选框,如何使用它们。我用了上面的例子,从答案上标记为正确。它起作用了,但是当我试图找到如何知道哪些复选框被标记时,我遇到了很多问题。经过大量的搜索,我找到了一个对我有效的解决方案,因为我看到没有太多的医生,所以我想为未来留下一个记录。我使用了几个解决方案作为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

除了提供的answer之外,还可以通过在父元素上使用^{}标志简化逻辑。

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)

这些选项将子项设置为可选择,并将默认值设置为未选中。如果子复选框没有给定状态,则不会显示checkbox元素。


上面的代码构建了一个非常简单的树。

Simple Tree

但是,如果选中父元素上的复选框,则会自动选择所有子元素:

Parent Selected

如果要取消选择单个子项,则父项将进入部分选定(三态):

TriState

如果取消选择所有子项,则将自动取消选择父项。如果取消选择父对象,则所有子对象也将自动取消选择。

QTreeWidgetItem实际上有一个内置的复选框,您可以很容易地使用它。

例如:

item = QTreeWidgetItem(self.treeWidget)

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

相关问题 更多 >

    热门问题