【发布时间】:2022-10-14 00:31:09
【问题描述】:
我有一个 QTreeWidget,每个 QTreeWidgetItem 都有 3 个复选框。我想做两件事,但我不知道该怎么做。
- 用户一次只能选择一个复选框 每个 QTreeWidgetItem.So 选择一个给定的复选框 QTreeWidgetItem 应该取消选择其他复选框 QTreeWidgetItem。
- 给定父 QTreeWidgetItem 复选框的选择/取消选择
应该选择/取消选择同一列中的所有子复选框。
下面是我的代码:
任何帮助将不胜感激
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()
【问题讨论】:
-
好吧,您可以先连接到
itemChanged信号来同时执行这两项操作:只要项目/列的checkState()为Checked,您只需执行任何操作,然后继续取消选中其他兄弟姐妹并检查孩子在该列:这将自动为所有子元素和孙子元素触发相同的操作。 -
我尝试过执行类似 child.itemChanged.connect(self.boxSelected) 的操作,但出现错误:“AttributeError: 'QTreeWidgetItem' object has no attribute 'itemChanged'”
-
为什么要连接到该项目?除了物品是不是QObjects(所以它们没有信号),您应该连接到表格小部件的信号。
-
我已经尝试过 ItemChanged 和 ItemClicked 但它们都只能正确检测到 qtreeWidgetItem 的选择而不是复选框。因此,如果我单击一个项目,然后单击另一个项目的复选框,则 currentItem 始终是我单击的那个而不是我选择的复选框
标签: python pyqt5 qtreewidget qtreewidgetitem