PySide2 QThread Как передать значение сигнала из главного потока в дочерний и наоборот

Пишу приложение, которое будет работать как минимум в двух потоках (естесно). Не получается разобраться с тем, как подключать грамотно потоки и передавать между ними сигналы. Прочел о двух методах создания потока в Qt. Первый - создание класса наследника от QThread и переопределение метода run своим функционалом. И второй - создание класса функционала и передача объекта класса на выполнение в дочерний поток moveToThread. Как объясняется в документации Qt, хорошим решением будет второй вариант, так как QThread является оберткой для системного API потоков и трогать внутренний функционал QThread без крайней необходимости не следует. Выбрал второй вариант.

Теперь к проблеме. Создаю в главном потоке, в __ init __ второй поток

# MainWindow Class, Main Thread
from user_interface.ui_threads.ui_treads_classes import ClassWithFunctionsForSecondThread
from ui_main import Ui_MainWindow
from PySide2 import QtCore


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.label_bg_saved.setText('')

        self.second_thread= QtCore.QThread()
        self.second_thread_class_obj = ClassWithFunctionsForSecondThread(mainWindow=self)
        self.second_thread_class_obj .moveToThread(self.second_thread)
        self.second_thread.start()

В самом классе ClassWithFunctionsForSecondThread, я наследуюсь от QObject, и передаю аргументом класс главного окна. (Важная ремарка, класс функционала для второго потока лежит в соседнем модуле, поэтому наследоваться от класса главного окна я не могу, иначе хватаю циклический импорт.) Весь ui лежит в отдельном модуле, поэтому обращение к элементам интерфейса через ui.

#Second Class in second module, second thread
import time
from PySide2.QtCore import QObject


class ClassWithFunctionsForSecondThread(QObject):
    def __init__(self, mainWindow, parent=None):
        super().__init__()
        self.mainWindow = mainWindow
    
    def run(self):

        print('признаки жизни второго потока')
        self.mainWindow.ui.label_bg_saved.setText('saved')
        time.sleep(2)
        self.mainWindow.ui.label_bg_saved.setText('')
        ...
        

(Ремарка, функционал run представлен примерно, так как интересует как передавать сигналы правильно. Помимо сообщения back_end -> ui интересует и обратная связь, из ui в back_end. Например, передача введенного в QLineEdit текста в дочерний поток)

При активации чекбокса в главном окне, второй поток должен это видеть и устанавливать на label свой текст, по прошествии 2х секунд удалять его и далее выполнялся бы еще некий функционал второго потока.

Но при попытке это провернуть, никаких признаков жизни от второго потока не получаю. Даже print() из класса функционала второго потока не подает никаких признаков жизни...

Что я делаю не так?) Буду очень признателен, если кто-то представит краткий пример, как правильно организовывать такое сообщение между потоками.


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