【问题标题】:QTreeWidgetItem hide child checkboxes but not parent checkboxesQTreeWidgetItem 隐藏子复选框但不隐藏父复选框
【发布时间】:2017-03-31 15:56:17
【问题描述】:

我有一个有两个级别的 QTreeWidget。父级是第一级,子级在下面。我希望父级别包含复选框,但我希望孩子没有复选框。在以下示例中,每个 QTreeWidgetItem 都显示一个复选框。如果我删除“child.setCheckState(0, Qt.Unchecked)”,那么所有复选框都会消失,而不仅仅是子复选框。

如何隐藏子复选框,而不是父复选框?

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(2):
        parent = QTreeWidgetItem(tree)
        parent.setText(0, "Parent {}".format(i))
        parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        parent.setExpanded(True)
        parent.setCheckState(0, Qt.Unchecked)
        for x in xrange(3):
            child = QTreeWidgetItem(parent)
            child.setFlags(child.flags() & ~(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable))
            child.setText(0, "Child {}".format(x))
            #child.setCheckState(0, Qt.Unchecked)
    tree.show() 
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python qt pyqt4 qtreewidget qtreewidgetitem


    【解决方案1】:

    这里的“child.setCheckState(0, Qt.Unchecked)”——确实意味着“您正在将复选框设置为未选中状态的“0”列”。

    现在重新访问您的代码:

    您没有为您想要的父母设置它,所以请执行以下操作:

    为父项设置复选框:

    parent.setCheckState(0, Qt.Unchecked)
    

    完全删除下面的代码,因为它会为您不想要的孩子设置复选框

    child.setCheckState(0, Qt.Unchecked)
    

    同时删除标志设置,因为我们注意到将标志设置为父项,被带到子项。

    代码在第一个 for 循环中大致如下所示:

            parent = QTreeWidgetItem(tree)
            parent.setText(0, "Parent {}".format(i))
            parent.setExpanded(True)
            parent.setCheckState(0, Qt.Unchecked)
            for x in xrange(3):
                child = QTreeWidgetItem(parent)
                child.setText(0, "Child {}".format(x))
    

    【讨论】:

    • 好收获。我的示例代码与我的真实代码不匹配。我已将您的建议和 m7913d 的建议添加到我上面的示例中。不幸的是,子复选框仍然可见。
    • 你是否完全删除了代码“child.setCheckState(0, Qt.Unchecked)”
    • 我仍然在您的代码中看到这个“child.setCheckState(0, Qt.Unchecked)”。请彻底删除
    • 如果我这样做,我不会得到任何复选框。无论是父母还是孩子。即使将 setCheckState 留给父级。
    • 我在 Cplusplus 中试过。这是工作。但我没有设置标志。能否请您在父母和孩子中注释掉标志声明并尝试一下?
    【解决方案2】:

    您应该从您的孩子flags 中删除标志ItemIsUserChechableItemIsSelectable,而不是添加它们:

    child.setFlags(child.flags() & ~(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable))
    

    我还希望您不应该设置孩子的 checkState,而应该设置父母的 checkState。 有关二进制操作的更多信息,请参阅python documentation

    【讨论】:

    • 好收获。我的示例代码与我的真实代码不匹配。我已将您的建议和 pavanc 的建议添加到我上面的示例中。不幸的是,子复选框仍然可见。您的建议阻止我检查它,但它并没有隐藏复选框本身。
    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2021-03-03
    相关资源
    最近更新 更多