Я пытаюсь создать собственный сигнал для объекта QRunnable для моего приложения PySide2. Все примеры привели меня к созданию сигнала следующим образом:
class Foo1(QtCore.QObject):
def __init__():
super().__init__()
self.thread = Foo2()
self.thread.signal.connect(foo)
def foo():
# do something
class Foo2(QtCore.QRunnable):
signal = QtCore.Signal()
Однако на self.thread.signal.connect(foo) я получаю следующую ошибку:
'PySide.QtCore.Signal' object has no attribute 'connect'
Как мне реализовать собственный сигнал для объекта QRunnable?






QRunnable не является QObject, поэтому у него не может быть сигналов, поэтому возможное решение - создать класс, который предоставляет сигналы:
class FooConnection(QtCore.QObject):
foosignal = QtCore.Signal(foo_type)
class Foo2(QtCore.QRunnable):
def __init__(self):
super(Foo2, self).__init__()
self.obj_connection = FooConnection()
def run(self):
# do something
foo_value = some_operation()
self.obj_connection.foosignal.emit(foo_value)
class Foo1(QtCore.QObject):
def __init__():
super().__init__()
self.pool = Foo2()
self.pool.obj_connection.foosignal.connect(foo)
QtCore.QThreadPool.globalInstance().start(self.pool)
@QtCore.Slot(foo_type)
def foo(self, foo_value):
# do something
@MatthewSpydell сигналы могут быть созданы только в классах, которые наследуются от QObject, например, виджеты являются QObject, работают с Qt в C++ и python, и условие QObject является обязательным в обоих. Если вы читали руководство, в котором говорится об обратном, я рекомендую вам его больше не читать. Например, документы означает: Примечание: сигналы следует определять только в классах, унаследованных от QObject. Таким образом, информация о сигнале добавляется в структуру класса QMetaObject.
Вот несколько примеров из официальной документации wiki.qt.io/Qt_for_Python_Signals_and_Slots. Последний демонстрирует нечто очень похожее с использованием QThread.
QRunnable is not a QObject сделал мой день. Спасибо! Я думал, что каждый класс, который начинается с Q, - это QObject
Я прочитал смешанную документацию о том, должен ли класс наследовать от QObject для реализации QtCore.Signal. В одном листе документации прямо сказано, что QtCore.Signal существует специально для того, чтобы разрешить создание сигналов для классов, которые не унаследованы от QObject (к сожалению, я больше не могу найти этот документ). Вы уверены, что наследование от QObject необходимо?