При связи сигнала со слотом в PyQt6 генерируется ошибка
Я переписываю программу с Python2, PyQt4 на Python3, PyQt6. Столкнулся с проблемой переформатирования старых сигналов на их новый формат вызова в PyQt6.
Старый сигнал выглядел так:
self.connect(receiver, Qt.SIGNAL("Event(PyQt_PyObject)"), self.receiver_event, Qt.Qt.QueuedConnection)
Я переписал сигнал выше так:
receiver.Event.connect(self.receiver_event, Qt.ConnectionType.QueuedConnection)
Но я получаю ошибку:
File "C:\Users\User\MyProject\exp.py", line 62, in add_receiver
receiver.Event.connect(self.receiver_event, Qt.ConnectionType.QueuedConnection)
TypeError: connect() failed between ModuleBase.Event[PyQt_PyObject] and unislot()
Никак не могу понять причину возникновения этой ошибки и исправить её.
Я сократил программу в целях удобства воспроизведения ошибки:
import sys
import queue
import threading
import qwt as Qwt
from PyQt6.QtCore import Qt, QObject, pyqtSignal
from PyQt6 import QtWidgets
class ModuleBase(QObject):
Event = pyqtSignal("PyQt_PyObject")
parentEvent = pyqtSignal("PyQt_PyObject")
def __init__(self, usethread=True, queuesize=20, name="ModuleBase", instance=0):
"""
Create a new recording module object
:param usethread: true if data transfer should be handled internally by worker thread
:param queuesize: size of receiver input queue in elements
:param name: module object identifier
:param instance: instance number for this object
"""
QObject.__init__(self, parent=None)
# set identifier and instance
self._object_name = name
self._instance = instance
# reset the receiver collection
self._receivers = []
# receiver input queue and data block
self._input_queue = queue.Queue(queuesize)
self._input_data = None
# reset the I/O worker thread
self._work = None
self._running = False
self._usethread = usethread
self._thLock = threading.Lock()
def add_receiver(self, receiver):
"""
Add an receiver object to the receiver collection.
Don't override this method.
:param receiver: ModuleBase object to add
"""
if not self._usethread:
return
# propagate start command to added receiver
if self._running:
receiver.start()
# attach receiver
self._receivers.append(receiver)
# receiver.connect(self, Qt.SIGNAL("parentEvent(PyQt_PyObject)"), receiver.parent_event, Qt.Qt.QueuedConnection)
self.parentEvent.connect(receiver.parent_event, Qt.ConnectionType.QueuedConnection)
# self.connect(receiver, Qt.SIGNAL("Event(PyQt_PyObject)"), self.receiver_event, Qt.Qt.QueuedConnection)
receiver.Event.connect(self.receiver_event, Qt.ConnectionType.QueuedConnection)
def parent_event(self, event):
"""
Get events from attached parent.
Don't override this method.
:param event: ModuleEvent object
"""
# let derived class objects handle the event
self.process_event(event)
# self.emit(Qt.SIGNAL('parentevent(PyQt_PyObject)'), event)
self.parentEvent.emit(event)
def receiver_event(self, event):
"""
Get events from attached receivers.
Don't override this method.
:param event: ModuleEvent object
"""
# let derived class objects handle the event
self.process_event(event)
# self.emit(Qt.SIGNAL('event(PyQt_PyObject)'), event)
self.Event.emit(event)
def process_event(self, event):
"""
Override this method to handle events from attached receivers
:param event: ModuleEvent
:return:
"""
return
class Device(ModuleBase):
def __init__(self, *args, **keys):
""" Constructor
"""
ModuleBase.__init__(self, name="Device", **keys)
class Display(Qwt.QwtPlot, ModuleBase):
""" Signal display widget.
"""
def __init__(self, *args, **keys):
ModuleBase.__init__(self, usethread=True, name="Display", **keys) # use transmit / receive thread
Qwt.QwtPlot.__init__(self, *args)
def main(args):
app = QtWidgets.QApplication(args)
obj1 = Device()
obj2 = Display()
obj1.add_receiver(obj2)
sys.exit(app.exit())
if __name__ == "__main__":
main(sys.argv)