При связи сигнала со слотом в 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)

Ответы (0 шт):