gpt4 book ai didi

python - 从 QTreeWidgetItem 子类 PyQt/PySide 发出信号的替代方案

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:22 25 4
gpt4 key购买 nike

我正在实现一个 GUI 分析软件,该软件使用 QTreeWidget 和几个自定义 TreeWidgetItem 类。树中的每个项目或多或少负责其自己的簿记,以跟踪附加到其上的数据集和对象。我希望能够从自定义 QTreeWidgetItems 的函数内发出信号,但以下代码会导致 myTWItem 无法转换为 QObject 的错误。有没有办法以这种方式从 QTreeWidgetItem 发出信号?

import sys
from PyQt5 import QtCore, QtWidgets, QtGui


class myTWItem(QtWidgets.QTreeWidgetItem):
childAdded = QtCore.pyqtSignal(object)

def addChild(self, child):
super(myTWItem, self).addChild(child)
self.childAdded.emit(child)

app = QtWidgets.QApplication(sys.argv)
tw = QtWidgets.QTreeWidget()

item = myTWItem()

tw.addTopLevelItem(item)
item.setText(0, "James")

child = QtWidgets.QTreeWidgetItem()
child.setText(0, "Braddock")
item.addChild(child)

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

输出:

>>Traceback (most recent call last):
>> File "C:/Coding/Python/dataquick/sandbox/treewidgettest.py", line 22, in <module>
>> item.addChild(child)
>> File "C:/Coding/Python/dataquick/sandbox/treewidgettest.py", line 10, in addChild
>> self.childAdded.emit(child)
>>TypeError: myTWItem cannot be converted to PyQt5.QtCore.QObject in this context
>>
>>Process finished with exit code 1

最佳答案

实现此目的的一种方法是在父树小部件上定义自定义信号。然后,从该项目中,您将能够执行以下操作:

tree = self.treeWidget()
if tree is not None:
tree.childAdded.emit(child)

当然,这里明显的缺点是,这对于尚未添加到树中的项目不起作用(尽管在某些情况下,这可能是一个优势)。

另一种方法是创建一个继承QObject的单独信号类。为了保持轻量级,最好使用它的共享实例,而不是为每个项目创建一个实例。这也可以避免为树中的每个项目建立连接:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui

class TWSignals(QtCore.QObject):
childAdded = QtCore.pyqtSignal(object)

class myTWItem(QtWidgets.QTreeWidgetItem):
signals = TWSignals()

def addChild(self, child):
super(myTWItem, self).addChild(child)
self.signals.childAdded.emit(child)

app = QtWidgets.QApplication(sys.argv)
tw = QtWidgets.QTreeWidget()

# connect using the class attribute
myTWItem.signals.childAdded.connect(
lambda item: print('child added:', item.text(0)))

item = myTWItem()

tw.addTopLevelItem(item)
item.setText(0, "James")

child = QtWidgets.QTreeWidgetItem()
child.setText(0, "Braddock")
item.addChild(child)

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

(注意:当然,以这两种方式执行操作意味着 sender() 不会返回您通常期望的结果)。

关于python - 从 QTreeWidgetItem 子类 PyQt/PySide 发出信号的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46592759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com