【问题标题】:Add and remove checkboxes for QTreeWidgetItems添加和删​​除 QTreeWidgetItem 的复选框
【发布时间】:2020-02-26 05:51:56
【问题描述】:

我的应用是用 PyQt5 编写的。 我有一个带有一些元素的 QTreeWidget:

Parent
--Child 1
--Child 2

我想动态添加和删除子元素的复选框。我设法用

添加了复选框
item.setFlags(item.flags() | 16)

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

但我有两个问题:

我无法删除这些复选框。我尝试重置标志,但复选框仍然存在,只是禁用了。我也不能使用样式表,因为我不能为单个 treeWidgetItem 设置 .setStyleSheet。如何删除它?

我不想这样。

小例子:

from PyQt5.QtWidgets import *

from PyQt5 import QtCore
app = QApplication([])
label = QTreeWidget()
label.show()
parent = QTreeWidgetItem(label)
parent.setText(0, "Parent")

child1 = QTreeWidgetItem(parent)
child1.setText(0, "child1")

child2 = QTreeWidgetItem(parent)
child2.setText(0, "child2")

child1.setFlags(child1.flags() | QtCore.Qt.ItemIsUserCheckable)
child1.setCheckState(0, QtCore.Qt.Checked)

child1.setFlags(child1.flags() & ~QtCore.Qt.ItemIsUserCheckable)


app.exec_()

改回 ItemIsUserCheckable 标志不会删除复选框。

【问题讨论】:

标签: python pyqt pyqt5 qtreewidget qtreewidgetitem


【解决方案1】:

不要放置

item.setFlags(item.flags() | 16)

因为不可读,最好使用

item.setFlags(item.flags() | Qt.ItemIsUserCheckable)

解决问题,如果您想删除复选框,则必须删除该标志:

item.setFlags(item.flags() & ~Qt.ItemIsUserCheckable)
item.setData(0, QtCore.Qt.CheckStateRole, None)

进行绘制的委托不考虑与 QModelIndex 关联的标志,因此正如@musicamante 指出的那样,还必须通过设置 None 来清除状态。

【讨论】:

  • 我想补充一点,即使在将检查状态设置为未选中后,复选框仍然可见,因为无论是否设置标志,代表都会绘制它。为了完全删除复选框,必须清除 CheckStateRole:item.setData(0, QtCore.Qt.CheckStateRole, None)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多