分享

PySide6中,多线程的使用【QTimer】、【QThread】以及【事件处理】

 ly88 2024-12-16


GIS 数据栈于 2024-11-26 15:37:23 发布
阅读量376 收藏 3
点赞数 5
文章标签: pyqt python 多线程

PySide6中,多线程的使用主要涉及到QTimer、QThread以及事件处理。这些技术可以帮助我们在GUI程序中执行耗时操作,同时保持界面的响应性。

QTimer

QTimer是一个定时器类,它可以用于在特定间隔后触发事件。当需要周期性执行某项操作时,比如定时发送数据或获取传感器数据,可以使用QTimer。它提供了重复定时器和单次定时器两种模式。

重复定时器:定时器会按照设定的间隔不断触发timeout()信号。

单次定时器:定时器只会在设定的时间后触发一次timeout()信号。

使用QTimer时,需要将其timeout()信号连接到一个槽函数上,该函数将包含要定时执行的代码。

from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButtonfrom PySide6.QtCore import QTimer, Qtclass MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()
        self.label = QLabel("等待...")
        self.btn = QPushButton("开始计时")
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)
        self.setWindowTitle('QTimer 示例')

        self.timer = QTimer()
        self.timer.timeout.connect(self.updateLabel)
        self.btn.clicked.connect(self.startTimer)

    def updateLabel(self):
        self.label.setText("已过去 %d 秒" % (self.timer.elapsed() / 1000))

    def startTimer(self):
        self.timer.start(1000)  # 1秒触发一次if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

QThread

QThread类用于管理线程。与QTimer不同,QThread允许你在一个独立的线程中执行任意代码,而不仅仅是定时触发事件。这对于执行耗时的计算或I/O操作非常有用,因为它可以避免阻塞主线程并导致GUI无响应。

在使用QThread时,你通常需要定义一个继承自QThread的类,并重写其run()方法。run()方法包含了要在线程中执行的代码。然后,你可以创建该类的实例,并调用其start()方法来启动线程。

此外,PySide6也支持使用moveToThread()方法将一个QObject对象及其子对象移动到一个新的线程中。这种方法更加灵活,因为它允许你在一个线程中执行多个任务,而不仅仅是run()方法中的代码。

from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButtonfrom PySide6.QtCore import QThread, Signal, Slotclass WorkerThread(QThread):
    result_ready = Signal(str)  # 定义一个信号,用于传递结果

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

    def run(self):
        # 模拟耗时操作
        time.sleep(5)
        result = "任务完成"
        self.result_ready.emit(result)class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.layout = QVBoxLayout()
        self.label = QLabel("等待...")
        self.btn = QPushButton("开始任务")
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)
        self.setWindowTitle('QThread 示例')

        self.thread = WorkerThread()
        self.thread.result_ready.connect(self.onResultReady)
        self.btn.clicked.connect(self.startThread)

    def startThread(self):
        self.thread.start()

    @Slot(str)
    def onResultReady(self, result):
        self.label.setText(result)if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

事件处理

在PySide6中,事件处理是通过信号和槽机制来实现的。信号是一种在某个特定事件发生时被发射(emit)的对象,而槽则是响应信号而被调用的函数或方法。你可以使用connect()方法将一个信号连接到一个槽上,以便在信号被发射时执行相应的操作。

多线程编程中,信号和槽机制特别重要,因为它允许你在不同线程之间进行安全的通信。你可以在一个线程中发射信号,并在另一个线程的槽函数中接收和处理该信号。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多