2017-10-05 3 views
1

mir eine GUI-Analyse-Software bin die Umsetzung, die eine QTreeWidget mit einem paar benutzerdefinierten TreeWidgetItem Klassen verwendet. Jedes Element in dem Baum ist mehr oder weniger für seine eigene Buchführung verantwortlich, indem es die mit ihm verbundenen Datensätze und Objekte verfolgt. Ich mag ein Signal aus den Funktionen der Gewohnheit QTreeWidgetItems emittieren zu können, aber die folgenden Code führt zu einem Fehler, dass myTWItem nicht auf eine QObject umgewandelt werden. Gibt es eine Möglichkeit, auf diese Weise ein Signal von einem QTreeWidgetItem zu senden?Alternativen zu emittieren ein Signal von einem QTreeWidgetItem SubClass PyQt/pyside

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_()) 

Ausgänge:

>>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 

Antwort

1

Eine Möglichkeit, dies zu tun, wäre es, die individuellen Signale auf dem Elternteilbaum-Widget zu definieren. Dann wird aus dem Artikel, würden Sie in der Lage zu tun:

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

Natürlich ist der offensichtliche Nachteil hier ist, dass dies nicht für die Einzelteile arbeitet, die noch nicht zu einem Baum hinzugefügt worden (obwohl, in einigen Szenarien könnte das ein Vorteil sein).

Eine andere Möglichkeit wäre, eine separate Signale Klasse zu erstellen, die QObject erbt. Um die Dinge leicht zu halten, wäre es am besten, eine gemeinsame Instanz zu verwenden, anstatt für jedes Element eine zu erstellen. Dies würde auch vermeiden, Anschlüsse für jedes Element im Baum zu müssen:

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_()) 

(NB: bedeutet natürlich, Dinge zu tun, in eine dieser beiden Möglichkeiten, dass sender() wird nicht zurückkehren, was werden Sie normalerweise erwarte es zu).

Verwandte Themen