Search code examples
pyqtpyqt5qthread

I wonder why pyqtSignal() is used. (pyqt, QThread, signal, slot)


This is the test code about QThread and Signal.

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time
import sys


class Thread1(QThread):
    set_signal = pyqtSignal(int)  # (1) @@

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

    def run(self):
        for i in range(10):
            time.sleep(1)
            self.set_signal.emit(i)   # (3) @@

class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        thread_start = QPushButton("시 작!")
        thread_start.clicked.connect(self.increaseNumber)

        vbox = QVBoxLayout()
        vbox.addWidget(thread_start)

        self.resize(200,200)
        self.setLayout(vbox)

    def increaseNumber(self):
        x = Thread1(self)
        x.set_signal.connect(self.print)  # (2) @@
        x.start()

    def print(self, number):
        print(number)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())

In the example of QThread I searched for, a pyqtSignal()(step 1) object was created, the desired slot function was connected(step 2) by connect, and then called by emit()(step 3).

I don't know the difference from calling the desired method immediately without connecting the connect().


Solution

  • So, the goal of codes is triggering a desired function every second. You are right about it.

    But if you create multiple objects, you can connect it to different desired functions. Or connect multiple function to one signal.

    x = Thread1(self)
    x.set_signal.connect(self.print)  # (2) @@
    x.start()
    
    y = Thread1(self)
    y.set_signal.connect(self.print2)
    time.sleep(0.5)
    y.start()