Мультиклассирование QObject и QThread вместе - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь создать набор конечных автоматов для решения различных задач в моем проекте PyQt. В процессе обработки способа обработки графики в одном потоке я создал два типа конечных автоматов., StateMachine, который должен наследовать QObject, и ThreadedStateMachine, который, чтобы избежать дублирования кода, был унаследован от StateMachine и QThread.

. Вот мой минимально полный кодЧтобы повторить проблему:

from PyQt5.QtCore import QObject, QThread


class StateMachine(QObject):
    def __init__(self):
        super().__init__()


class ThreadedStateMachine(StateMachine, QThread):
    def __init__(self):
        super().__init__()


if __name__ == "__main__":
    t = ThreadedStateMachine()

Я ожидал, что это сработает без сбоев, но вместо этого я получаю это исключение

QObject::connect: No such signal ThreadedStateMachine::started()
Traceback (most recent call last):
  File "/snap/pycharm-community/132/helpers/pydev/pydevd.py", line 1758, in <module>
    main()
  File "/snap/pycharm-community/132/helpers/pydev/pydevd.py", line 1752, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/snap/pycharm-community/132/helpers/pydev/pydevd.py", line 1147, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/snap/pycharm-community/132/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/home/aaron/.PyCharmCE2019.1/config/scratches/emerson_pmd/new/scratch_7.py", line 15, in <module>
    t = ThreadedStateMachine()
  File "/home/aaron/.PyCharmCE2019.1/config/scratches/emerson_pmd/new/scratch_7.py", line 11, in __init__
    super().__init__()
  File "/home/aaron/.PyCharmCE2019.1/config/scratches/emerson_pmd/new/scratch_7.py", line 6, in __init__
    super().__init__()
  File "/snap/pycharm-community/132/helpers/pydev/_pydev_bundle/pydev_monkey_qt.py", line 181, in __init__
    self.started = StartedSignalWrapper(self, self.started)
  File "/snap/pycharm-community/132/helpers/pydev/_pydev_bundle/pydev_monkey_qt.py", line 151, in __init__
    self.original_started.connect(self._signal)
TypeError: connect() failed between started() and _signal()

Как правильно объединить QObject и QThread классы в один объект?

Примечание

В настоящее время я использую threading.Thread в качестве обходного пути, но я хотел бы иметь возможность запустить QMessageBox из другого потока,который показывает ошибку:

QObject::connect: Cannot queue arguments of type 'QItemSelection'
(Make sure 'QItemSelection' is registered using qRegisterMetaType().)
QBasicTimer::start: Timers cannot be started from another thread

Я считаю, что использование QThread будет работать здесь.

1 Ответ

3 голосов
/ 01 июня 2019

Что ж, у вас есть проблема. PyQt не разрешает двойное наследование 2 QObject, StateMachine является QObject, а QThread также является QObject (см. docs ).

Я не думаю, что проблема вызвана многопоточностью. Thread (), я подозреваю, что это вызвано тем, что вы модифицируете некоторый объект, который живет в потоке и не является поточно-безопасным, объекты QObject не являются поточно-безопасными, поэтому вы должны взаимодействовать с этими объектами в потоке, в котором они живут, а модели - QObject.

Читать:

...