欢迎访问宙启技术站
智能推送

Qtpy.QtWidgets:使用线程实现并发操作

发布时间:2023-12-14 03:47:36

在Qtpy.QtWidgets库中,我们可以使用线程来实现并发操作。线程可以用于在后台执行耗时的任务,同时保持UI的响应性。下面是一个使用线程实现并发操作的例子:

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
from PyQt5.QtCore import QThread, pyqtSignal


class WorkerThread(QThread):
    progress_changed = pyqtSignal(int)

    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)
        self.running = True

    def run(self):
        progress = 0
        while progress <= 100 and self.running:
            self.progress_changed.emit(progress)
            progress += 1
            self.msleep(100)  # 模拟耗时操作

    def stop(self):
        self.running = False


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("Concurrent Operations")
        self.setGeometry(100, 100, 400, 200)

        self.start_button = QPushButton("Start", self)
        self.start_button.setGeometry(150, 50, 100, 30)
        self.start_button.clicked.connect(self.start_operation)

        self.progress_label = QLabel(self)
        self.progress_label.setGeometry(150, 100, 100, 30)

        self.worker_thread = WorkerThread()
        self.worker_thread.progress_changed.connect(self.update_progress)

    def start_operation(self):
        self.worker_thread.start()

    def update_progress(self, progress):
        self.progress_label.setText(f"Progress: {progress}%")
        if progress == 100:
            self.worker_thread.stop()


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

在上面的例子中,我们创建了一个MainWindow类作为主窗口。主窗口中有一个"Start"按钮,点击该按钮会创建并启动一个WorkerThread线程。WorkerThread线程模拟一个耗时的操作,在每次循环中通过发射信号告诉主窗口当前操作的进度。主窗口接收到信号后更新进度标签的文本,直到操作完成。当操作完成时,这个例子中停止了线程。

这个例子展示了如何使用线程来执行耗时操作,并通过信号和槽机制在主线程中更新UI。通过使用线程,我们可以确保UI的响应性,并允许用户同时执行其他操作。

总结起来,Qtpy.QtWidgets库提供了线程类和信号槽机制,方便我们在应用程序中实现并发操作。这样我们可以轻松地执行耗时操作,同时保持UI的响应性。