QTreeWidgetItem隐藏子复选框,但不隐藏父复选框

时间:2017-03-31 15:56:18

标签: python qt pyqt4 qtreewidget qtreewidgetitem

我有一个有两个级别的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()

2 个答案:

答案 0 :(得分:1)

这里" child.setCheckState(0,Qt.Unchecked)" - 确实意味着" 你正在设置复选框到#34; 0"未经检查的状态"。

现在重新访问您的代码:

你没有为你想要的父母设置它,所以做下面的事情:

设置父项的复选框:

parent.setCheckState(0, Qt.Unchecked)

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

child.setCheckState(0, Qt.Unchecked)

同样删除标记设置,因为我们注意到设置父标记的标记,被带到子项目。

代码在第一个循环中大致看起来像这样:

        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))

答案 1 :(得分:0)

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

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

我也希望你不应该设置孩子的checkState,而是父子的checkState。 有关二进制操作的详细信息,请参阅python documentation