Python 从QTreeWidgetItem子类PyQt/PySide发出信号的替代方法
我正在实现一个gui分析软件,它使用一个带有两个自定义TreeWidgetItem类的QTreeWidget。树中的每个项都或多或少地负责自己的簿记,以跟踪附加到树上的数据集和对象。我希望能够从自定义QTreeWidgetItems的函数中发出信号,但以下代码导致MyTItem无法转换为QObject的错误。有没有任何方法可以通过这种方式从QTreeWidgetItem发出信号 导入系统 从PyQt5导入QtCore、QtWidgets、QtGui 类myTWItem(QtWidgets.QTreeWidgetItem): childAdded=QtCore.pyqtSignal(对象) def addChild(self,child): super(myTWItem,self).addChild(child) self.childAdded.emit(子) app=qtwidts.QApplication(sys.argv) tw=qtwidts.QTreeWidget() item=myTWItem() tw.addTopLevelItem(项目) item.setText(0,“James”) child=QtWidgets.QTreeWidgetItem() child.setText(0,“布洛克”) 项目.添加子项(子项) tw.show() sys.exit(app.exec_()) 产出:Python 从QTreeWidgetItem子类PyQt/PySide发出信号的替代方法,python,pyqt,pyqt5,signals-slots,qtreewidgetitem,Python,Pyqt,Pyqt5,Signals Slots,Qtreewidgetitem,我正在实现一个gui分析软件,它使用一个带有两个自定义TreeWidgetItem类的QTreeWidget。树中的每个项都或多或少地负责自己的簿记,以跟踪附加到树上的数据集和对象。我希望能够从自定义QTreeWidgetItems的函数中发出信号,但以下代码导致MyTItem无法转换为QObject的错误。有没有任何方法可以通过这种方式从QTreeWidgetItem发出信号 导入系统 从PyQt5导入QtCore、QtWidgets、QtGui 类myTWItem(QtWidgets.QTr
>>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
>回溯(最近一次呼叫最后一次):
>>文件“C:/Coding/Python/dataquick/sandbox/treewidgetset.py”,第22行,在
>>项目.添加子项(子项)
>>文件“C:/Coding/Python/dataquick/sandbox/treewidgetset.py”,第10行,在addChild中
>>self.childAdded.emit(子)
>>TypeError:在此上下文中,MyTItem无法转换为PyQt5.QtCore.QObject
>>
>>进程已完成,退出代码为1
一种方法是在父树小部件上定义自定义信号。然后,从项目中,您可以执行以下操作:
tree = self.treeWidget()
if tree is not None:
tree.childAdded.emit(child)
当然,这里明显的缺点是,这对尚未添加到树中的项目不起作用(尽管在某些情况下,这可能是一个优势)
另一种方法是创建一个单独的signals类,该类继承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_())
(注:当然,以这两种方式中的任何一种做事情都意味着不会得到你通常期望的回报)