python - 当一个复选框被切换时,如何获取 QTreeWidget 项目的文本?
问题描述
我制作了一个 QTreeWidget,它有很多行,每行都有一个文本项和一个复选框。当复选框被切换时,我如何获取文本?我知道我可以使用 currentItem() 来获取当前选中的 TreeWidgetItem,但不一定选中该行。而且我不能使用 QTreeWidget 的 itemClicked/itemPressed 信号,因为当单击其中的复选框小部件时它们似乎不会发出。
from PySide2 import QtWidgets
class TestUI(QtWidgets.QDialog):
def __init__(self):
super(TestUI, self).__init__()
self.tree = QtWidgets.QTreeWidget()
self.tree.setHeaderLabels(('text', 'checkbox'))
for x in range(0, 3):
item = QtWidgets.QTreeWidgetItem(self.tree)
item.setText(0, str(x))
checkbox = QtWidgets.QCheckBox(parent=self.tree)
checkbox.stateChanged.connect(self.checkbox_toggled)
self.tree.setItemWidget(item, 1, checkbox)
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.tree)
def checkbox_toggled(self):
print 'The text of the checkbox TreeWidgetItem is...'
print None
if __name__ == "__main__":
try:
ui.deleteLater()
except:
pass
ui = TestUI()
ui.show()
解决方案
该解决方案涉及获取QCheckBox所属的QTreeWidgetItem,因此可能的解决方案是使用按下的QCheckbox的位置,因为它是视口的子项,因此可以使用indexAt()方法获取项目。要获取插槽中的 QCheckbox,您可以使用 sender() 方法:
class TestUI(QtWidgets.QDialog):
def __init__(self):
super(TestUI, self).__init__()
self.tree = QtWidgets.QTreeWidget()
self.tree.setHeaderLabels(("text", "checkbox"))
for x in range(0, 3):
item = QtWidgets.QTreeWidgetItem(self.tree)
item.setText(0, str(x))
checkbox = QtWidgets.QCheckBox()
checkbox.stateChanged.connect(self.checkbox_toggled)
self.tree.setItemWidget(item, 1, checkbox)
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.tree)
def checkbox_toggled(self):
checkbox = self.sender()
print("sender: {}".format(checkbox))
if checkbox is None:
return
item = self.tree.itemAt(checkbox.pos())
if item is not None:
print("The text of the checkbox TreeWidgetItem is {}".format(item.text(0)))
推荐阅读
- angular - 数组长度为0时如何隐藏div
- android - 找不到类 javax.xml.crypto.dsig.dom.DOMSignContext
- vue.js - 与 vuejs 一起使用时无法更新 prismjs 的属性行号?
- java - 如何修复 java.lang.InstantiationException?
- java - 从 gradle 实现中删除 ActionBarSharelock 后出现“ActionBarSherlock”错误
- laravel - 在 laravel 6.0 中未定义命令“ui”
- typescript - typescript: create a function accepting IncomingHttpHeaders as parameter
- angular - TypeScript declare var error for object.property - what to do?
- entity-framework - 有没有办法自动对我的整个 EDMX 设计器进行排序?
- mongodb - Mongo 仅更新子文档中的一项并在同一子文档中添加一项