Как реализовать многопоточность qt5 в python?

Пользователь

от cierra , в категории: Python , 7 месяцев назад

Как реализовать многопоточность qt5 в python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от linnea , 6 месяцев назад

@cierra 

Для реализации многопоточности в Qt5 на языке Python можно использовать модуль QThread.

  1. Начнем с создания собственного класса, унаследованного от QThread:
1
2
3
4
5
6
7
8
from PyQt5.QtCore import QThread

class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        # здесь должен быть код, который выполнится в отдельном потоке


  1. Далее в методе run() можно указать код, который будет выполняться в отдельном потоке. Например, можно создать цикл, который будет выводить числа:
1
2
3
4
5
6
7
8
9
from PyQt5.QtCore import QThread

class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            print(i)


  1. Создаем объект класса MyThread и запускаем его метод start():
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from PyQt5.QtCore import QThread

class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            print(i)

my_thread = MyThread()   # создаем объект класса
my_thread.start()        # запускаем поток


  1. Можно добавить сигналы и слоты для обмена информацией между потоками. Например, можно создать сигнал, который будет передавать число из потока в основной поток, и соответствующий слот:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from PyQt5.QtCore import QThread, pyqtSignal

class MyThread(QThread):
    num_signal = pyqtSignal(int)

    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            self.num_signal.emit(i)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, pyqtSlot

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        layout = QVBoxLayout()
        self.label = QLabel("Waiting for number...")
        layout.addWidget(self.label)

        self.thread = MyThread()             # создаем объект класса MyThread
        self.thread.num_signal.connect(self.on_num_signal)   # подключаем сигнал к слоту
        self.thread.start()                  # запускаем поток

        self.setLayout(layout)

    @pyqtSlot(int)
    def on_num_signal(self, num):
        self.label.setText(f"Got number: {num}")


  1. Используя многопоточность в Qt5 можно реализовать долгие операции, не блокируя пользовательский интерфейс. Таким образом, приложение не будет зависать во время выполнения задачи в отдельном потоке.