2017-10-05 15 views
1

로부터 신호를 방출합니다. 트리의 각 항목은 자체 책에 대해 어느 정도 책임이 있으므로 데이터 세트 및 첨부 된 객체를 추적 할 수 있습니다. 나는 사용자 정의 QTreeWidgetItems의 기능 내에서 신호를 방출 할 수 있도록하고 싶습니다하지만, 다음 코드를 실행하면 오류가 발생이 myTWItem는 QObject를 변환 할 수 없다. 이 방법으로 QTreeWidgetItem에서 신호를 내보내는 방법이 있습니까?대안 내가 정의 TreeWidgetItem 클래스의 부부와 QTreeWidget를 사용하는 GUI를 분석 소프트웨어를 구현 오전 QTreeWidgetItem 하위 클래스 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_()) 

출력 :이 작업을 수행하는

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

답변

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

(NB는 : 이것은 또한 트리에서 모든 항목에 대한 연결을하는 것을 피하기 것입니다 물론,이 두 가지 방법 중 하나를 사용하여 일을하는 sender() 반환하지 않습니다 무엇을 의미하는지 당신은 일반적으로 좋겠 기대).