В таком виде, как приведено тут вообще работать не будет, в таком виде он даже не запустится.
̶Q̶T̶h̶r̶e̶a̶d̶ ̶н̶е̶ ̶н̶а̶с̶л̶е̶д̶н̶и̶к̶ ̶Q̶O̶b̶j̶e̶c̶t̶ ̶и̶ ̶н̶е̶ ̶м̶о̶ж̶е̶т̶ ̶и̶с̶п̶у̶с̶к̶а̶т̶ь̶ ̶с̶и̶г̶н̶а̶л̶ы̶. -> UPD: с определенной версии (в 5.15 точно) QThread наконец-то стал наследником QObject, так что он теперь может сам испускать сигналы. Костыль из класса сигналлера более не актуален
Из соседнего потока нельзя вызывать изменения виджетов окна, только испуская и ловя сигналы.
Не наследуйтесь от двух классов одновременно, огребете странностей.
На тостере есть примеры, как в простом виде компоновать Qt.
В общем виде, через QRunnable, выглядит так:
import sys
import time
from PySide2.QtCore import QThreadPool, QRunnable, Signal, QObject
from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QHBoxLayout
class Main(QMainWindow):
def __init__(self):
super(Main, self).__init__()
centralWidget = QWidget(self)
self.setCentralWidget(centralWidget)
# добавляем компонощик
self.h_grid = QHBoxLayout(centralWidget)
self.thread = QThreadPool().globalInstance()
# добаляем кнопки
self.button = QPushButton('Start thread')
self.h_grid.addWidget(self.button)
self.worker = Worker()
self.worker.finished.connect(self.__on_finish)
self.button.clicked.connect(self.start_worker)
def start_worker(self):
self.thread.start(self.worker)
def __on_finish(self):
print('Воркер закончил работу')
class WorkerSignaller(QObject):
finished = Signal()
class Worker(QRunnable):
def __init__(self):
super(Worker, self).__init__()
self.signaller = WorkerSignaller()
self.finished = self.signaller.finished
def run(self):
print(f'Я воркер, и я запускаюсь')
time_to_sleep = 10
print(f'Я воркер, и я сплю {time_to_sleep} секунд')
time.sleep(time_to_sleep)
print(f'Я воркер, и я поспал')
self.finished.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Main()
ex.show()
sys.exit(app.exec_())