首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyqt5 QTreeWIdgetItem与选择一项复选框在atime

Pyqt5 QTreeWIdgetItem与选择一项复选框在atime
EN

Stack Overflow用户
提问于 2022-10-12 08:50:33
回答 1查看 43关注 0票数 0

我有一个QTreeWidget,每个QTreeWidgetItem有3个复选框,我想做两件事,但我不知道如何做。

QTreeWidgetItem.

  • The
  1. 用户应该只能为每个QTreeWidgetItem.So选择一个复选框,对给定的QTreeWidgetItem复选框的选择应该取消选择其他复选框,该复选框的其他复选框应该选择/取消选中/取消选中同一列中的所有子复选框。下面是我的代码:

任何帮助都将不胜感激。

代码语言:javascript
运行
复制
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()
    tree.resize(500, 200)
    headerItem  = QtWidgets.QTreeWidgetItem()
    item    = QtWidgets.QTreeWidgetItem()
    tree .setColumnCount(4)
    tree .setHeaderLabels(["pluto", "X", "Y", "Z", ""])
    for i in range(3):
        parent = QtWidgets.QTreeWidgetItem(tree)
        parent.setText(0, "Parent {}".format(i))
        parent.setCheckState(1, Qt.Unchecked)
        parent.setCheckState(2, Qt.Unchecked)
        parent.setCheckState(3, Qt.Unchecked)
        #parent.setFlags(parent.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
        for x in range(5):
            child = QtWidgets.QTreeWidgetItem(parent)
            child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
            child.setText(0, "Child {}".format(x))
            child.setCheckState(1, Qt.Unchecked)
            child.setCheckState(2, Qt.Unchecked)
            child.setCheckState(3, Qt.Unchecked)


    tree.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
EN

回答 1

Stack Overflow用户

发布于 2022-10-13 16:31:09

如果有人感兴趣的话,我已经用itemClicked.Here解决了自己的问题。

代码语言:javascript
运行
复制
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.Qt import Qt
import sys

class treeManagement:
    def __init__(self):
        app     = QtWidgets.QApplication(sys.argv)
        self.tree    = QtWidgets.QTreeWidget()
        self.tree.resize(500, 200)
        headerItem  = QtWidgets.QTreeWidgetItem()
        item    = QtWidgets.QTreeWidgetItem()
        self.tree .setColumnCount(4)
        self.tree .setHeaderLabels(["pluto", "X", "Y", "Z", ""])
        for i in range(3):
            parent = QtWidgets.QTreeWidgetItem(self.tree)
            parent.setText(0, "Parent {}".format(i))
            parent.setCheckState(1, Qt.Unchecked)
            parent.setCheckState(2, Qt.Unchecked)
            parent.setCheckState(3, Qt.Unchecked)

            for x in range(5):
                child = QtWidgets.QTreeWidgetItem(parent)
                child.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                child.setText(0, "Child {}".format(x))
                child.setCheckState(1, Qt.Unchecked)
                child.setCheckState(2, Qt.Unchecked)
                child.setCheckState(3, Qt.Unchecked)

        self.tree.itemClicked.connect(self.checkboxSelectionChanged)
        self.tree.show()
        sys.exit(app.exec_())

    def checkboxSelectionChanged(self,selectedItem, selectedColumn):
        print(selectedItem.text(0))
        print(selectedColumn)
        # In this method I manage checkbox selected

        if selectedItem is None:
            return

        # 0-The item is unchecked.
        # 1-The item is partially checked. Items in hierarchical models may be partially checked if some, but not all,
        # of their children are checked.
        # 2-The item is checked.

        sumCheckState = selectedItem.checkState(1) + selectedItem.checkState(2) + selectedItem.checkState(3)

        state = QtCore.Qt.Unchecked
        for i in range(1, 4):
            if selectedColumn != i:
                if sumCheckState >= 4:  # Prevent update if user clicked in the space near checkbox or there's only one
                    # checkbox currently checked in this row
                    selectedItem.setCheckState(i, QtCore.Qt.Unchecked)
            elif selectedItem.childCount() > 0:  # selectedColumn=i
                for j in range(selectedItem.childCount()):
                    child = selectedItem.child(j)
                    for k in range(1, 4):
                        if selectedColumn != k:
                            if sumCheckState >= 4 or (sumCheckState == 2 and child.checkState(k) == QtCore.Qt.Checked
                                and selectedItem.checkState(selectedColumn) != QtCore.Qt.Unchecked):
                                # Prevent update if user clicked in the space near checkbox or there's only one
                                # checkbox currently checked in this row
                                child.setCheckState(k, QtCore.Qt.Unchecked)
                        else:
                            child.setCheckState(k, selectedItem.checkState(selectedColumn))
            elif selectedItem.parent() is not None:
                # I have clicked on a child element so no parent should be in checked state
                if sumCheckState >= 4:  # Prevent update if user clicked in the space near checkbox or there's only one
                    # checkbox currently checked in this row
                    for i in range(1, 4):
                        selectedItem.parent().setCheckState(i, QtCore.Qt.Unchecked)

if __name__ == '__main__':
    t=treeManagement()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74039022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档