PyQt6 从零构建计时器:从基础到信号槽与多线程

纸上星河
纸上星河
发布时间:2026-10-10 | 3人浏览过
原创

本文详解如何使用 PyQt6 从零开发一个计时器应用。内容涵盖 PyQt6 基础组件使用、通过 Qt Designer 设计 UI 表单、加载 .ui 文件,以及利用信号槽机制和 Python 多线程实现精确计时与界面刷新。

PyQt6 基础环境搭建

PyQt6 是跨平台 GUI 框架 Qt 的 Python 绑定,支持通过 pip 直接安装。在 PyQt6 中,函数通常以 Q 开头并采用驼峰命名法。开发者可以直接导入组件而无需添加 qt. 前缀。

pip install PyQt6

创建一个最基础的窗口需要几个关键步骤:首先通过 QApplication 创建应用实例,该实例必须赋值给变量以保持程序存活;接着使用 QDialog 创建窗口,可通过 resize 方法设定尺寸,并通过 setLayout 添加布局管理器(如 QHBoxLayout)。最后,通过 show() 显示窗口,并在末尾调用 app.exec() 阻塞程序,防止窗口闪退。

import PyQt6.QtWidgets as qt
 
app = qt.QApplication([])
win = qt.QDialog()
win.resize(400,150)
hbox = qt.QHBoxLayout()
btn = qt.QPushButton("点我")
btn.clicked.connect(lambda: qt.QMessageBox.information(
    win, "Msg", "你点了我"))
hbox.addWidget(btn)
win.setLayout(hbox)
win.show() 

面向对象封装与事件绑定

将基础代码封装为类可以提高结构清晰度。在类中,通过 clicked.connect 将按钮的点击信号绑定到自定义的槽函数(slot)。例如,点击按钮时触发 show_msg 方法,该方法内部调用 QMessageBox.information 弹出信息框。

import PyQt6.QtWidgets as qt
import sys

class QT1:
    def __init__(self):
        app = qt.QApplication([])
        self.win = qt.QDialog()
        self.win.resize(400,150)
        hbox = qt.QHBoxLayout()
        btn = qt.QPushButton("点我")
        btn.clicked.connect(self.show_msg)
        hbox.addWidget(btn)
        self.win.setLayout(hbox)
        self.win.show() 
        sys.exit(app.exec())
    
    def show_msg(self):
        qt.QMessageBox.information(self.win, "信息提示", "你点击了我")


if __name__ == "__main__":
    QT1()

使用 Qt Designer 设计 UI 表单

虽然可以直接在代码中构建界面,但使用 Qt Designer 能更高效地规划布局。安装 pyside6 后即可启动设计器,选择 Main Window 模板创建项目。通过快捷键 Ctrl+S 保存为 .ui 文件,这是一种通用的界面描述格式。

pip install pyside6
pyside6-designer

在界面设计中,推荐使用 LCD Number 组件显示计时数值,使用 Push Button 作为控制按钮。双击按钮可修改显示文字,并在右侧属性栏中修改部件名称,例如将开始按钮命名为 bnStart,停止按钮命名为 bnStop,而 LCD 数字屏保留默认名称 lcdNumber。

加载 UI 文件并实现逻辑

Qt Designer 仅负责界面绘制,逻辑需通过 Python 实现。在 main.ui 同级目录下创建 Python 脚本,利用 PyQt6.uic 模块加载 UI 文件。

from PyQt6 import uic
from PyQt6.QtWidgets import QApplication, QMainWindow
import sys

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('main.ui', self)  # 加载UI文件

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec())

计时器核心逻辑:信号、槽与多线程

实现计时功能需要处理按钮点击信号(click),并将其绑定到执行函数(槽)。在 PyQt6 中,connect 方法用于建立这种绑定关系。虽然槽(slot)是 PyQt 的概念,但在 Python 实现中并非强制使用特定类结构,只需定义普通方法即可。

由于界面刷新和计时计算需要持续运行,直接在主线程中循环会导致界面卡死。因此,引入 threading.Thread 创建后台线程执行计时逻辑。

import time
from threading import Thread

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('main.ui', self)  # 加载UI文件
        self.bnStart.clicked.connect(self.bnStart_click)
        self.bnStop.clicked.connect(self.bnStop_click)

    def timer(self):
        t0 = time.time()
        while self.isRunning:
            dt = time.time() - t0
            self.lcdNumber.display(f"{dt:.3f}")
            time.sleep(0.1)

    def bnStart_click(self):
        self.isRunning = True
        self.lcdNumber.display("0")
        Thread(target = self.timer, daemon=True).start()

    def bnStop_click(self):
        if self.isRunning:
            self.isRunning = False
        else:
            self.lcdNumber.display("0")

在 bnStart_click 中,设置 isRunning 为 True 并启动守护线程执行 timer 方法。timer 方法通过计算当前时间与起始时间的差值,并调用 lcdNumber.display 更新显示。停止按钮点击时,将 isRunning 设为 False 以终止循环。

以上就是基于 PyQt6 从零构建计时器的详细内容,更多关于 PyQt6 教程、GUI 开发、信号槽机制与多线程处理的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表