Объект PySide2.QtCore.Signal не имеет атрибута connect

Я пытаюсь создать собственный сигнал для объекта 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
4 998
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я прочитал смешанную документацию о том, должен ли класс наследовать от QObject для реализации QtCore.Signal. В одном листе документации прямо сказано, что QtCore.Signal существует специально для того, чтобы разрешить создание сигналов для классов, которые не унаследованы от QObject (к сожалению, я больше не могу найти этот документ). Вы уверены, что наследование от QObject необходимо?

Matthew Spydell 30.10.2018 03:06

@MatthewSpydell сигналы могут быть созданы только в классах, которые наследуются от QObject, например, виджеты являются QObject, работают с Qt в C++ и python, и условие QObject является обязательным в обоих. Если вы читали руководство, в котором говорится об обратном, я рекомендую вам его больше не читать. Например, документы означает: Примечание: сигналы следует определять только в классах, унаследованных от QObject. Таким образом, информация о сигнале добавляется в структуру класса QMetaObject.

eyllanesc 30.10.2018 03:10

Вот несколько примеров из официальной документации wiki.qt.io/Qt_for_Python_Signals_and_Slots. Последний демонстрирует нечто очень похожее с использованием QThread.

Zompa 29.01.2020 09:10
QRunnable is not a QObject сделал мой день. Спасибо! Я думал, что каждый класс, который начинается с Q, - это QObject
RedEyed 23.02.2021 15:23

Другие вопросы по теме