当前位置: 首页 > news >正文

PyQt5 -- QtCore

PyQt5.QtCore模块提供了非 GUI 的核心功能,是构建任何 PyQt5 应用(无论是否包含图形界面)都必不可少的基础模块。与提供具体控件的QtWidgets模块不同,QtCore主要负责提供应用所需的基础设施,如事件循环、对象间通信、多线程、文件和目录操作、时间日期处理等。

核心类与功能

QtCore模块包含了许多重要的类和工具,以下是其中最核心的部分:

1、元对象系统与信号槽:QObject与通信机制

QtCore模块为 PyQt5 提供了强大的元对象系统(Meta-Object System)。QObject类是所有 Qt 对象的基类,它赋予了对象使用信号与槽(Signals & Slots) 进行通信的能力。

  • 自定义信号:通过pyqtSignal()QObject的子类中定义。信号可以携带任意数量的参数。

  • 自定义槽函数:任何普通的 Python 函数都可以作为槽。使用@pyqtSlot()装饰器可以明确标识槽函数,并进行参数类型检查。

  • 信号与槽的连接:使用信号.connect(槽函数)进行连接。一个信号可以连接多个槽,一个槽也可以被多个信号连接。信号甚至可以连接另一个信号。

2、应用与事件循环:QCoreApplication

这是所有 Qt 应用的核心,负责管理主事件循环(Event Loop)。QApplication类(来自QtWidgets)就是它的子类,专门为 GUI 应用提供了额外功能。

  • 核心作用app.exec_()会启动主事件循环,让程序持续运行并等待和分发事件(如鼠标点击、键盘输入、定时器事件等)。

  • 无 GUI 应用:对于纯控制台应用或无界面程序,可以直接使用QCoreApplication

3、多线程与并发:QThread

QThread是 PyQt5 中实现多线程的核心类,用于将耗时任务移出主线程,防止界面“卡死”。

使用方法:通常有两种方式:

继承QThread创建QThread的子类,并重写其run()方法,将耗时任务放在run()中执行。

moveToThread()创建一个继承自QObject的工作类,将其实例通过moveToThread()移动到QThread对象中执行。这是官方更推荐的方式,因为它更灵活。

关键原则:子线程中绝不能直接操作 UI 元素,必须通过信号与槽机制将数据传回主线程进行更新。

4、定时器:QTimer

QTimer类提供了定时器功能,可以周期性或单次地触发任务

核心信号:timeout() 信号在定时器超时时被发射

常用方法

  • start(msec):启动定时器,设置间隔(毫秒)。

  • stop():停止定时器。

  • setSingleShot(True):设置为单次触发模式。

  • QTimer.singleShot(msec, callable):静态方法,用于创建单次定时器

5、文件与目录操作:QFileQDir

QtCore提供了跨平台的文件和目录操作类。

  • QFile:用于读写文件,支持二进制和文本模式。常与QTextStream配合进行方便的文本读写。

  • QDir:用于操作目录,如创建、删除、遍历目录内容,获取文件列表等。

  • QFileInfo:提供文件的详细信息,如大小、权限、修改时间等。

6、数据处理与工具类

QtCore还提供了许多用于数据处理和系统交互的工具类。

  • 时间日期QDateQTimeQDateTime用于处理日期和时间。

  • 字节数组QByteArray用于处理原始二进制数据。

  • 配置管理QSettings提供了跨平台的应用程序设置存储和恢复功能。它可以以统一的方式在 Windows 注册表、macOS 的 plist 文件或 Unix 的 INI 文件中存储配置。

  • 进程管理QProcess用于启动和控制外部程序。

---------------------------------------------------------------------------------------------------------------------------------

常见用法

1、自定义信号与槽

from PyQt5.QtCore import QObject, pyqtSignal

class Worker(QObject):
# 1. 定义信号,可携带参数
finished = pyqtSignal(str)
progress = pyqtSignal(int)

def do_work(self):
# 2. 在合适的时机发射信号
self.progress.emit(0)
# ... 执行耗时操作 ...
self.progress.emit(100)
self.finished.emit("任务完成!")

2、使用QThread处理耗时任务

from PyQt5.QtCore import QThread, pyqtSignal

class WorkerThread(QThread):
result = pyqtSignal(str)

def run(self):
# 耗时操作
import time
time.sleep(5)
self.result.emit("计算完成!")

# 在主线程中使用
self.thread = WorkerThread()
self.thread.result.connect(self.update_ui) # update_ui 是主线程的槽函数
self.thread.start()

这样就能避免阻塞主线程

3、使用QTimer创建定时任务

from PyQt5.QtCore import QTimer

# 创建定时器
self.timer = QTimer()
# 连接超时信号
self.timer.timeout.connect(self.update_time) # update_time 是槽函数
# 每1000毫秒触发一次
self.timer.start(1000) # [reference:63][reference:64]

4、使用QSettings保存和加载设置

from PyQt5.QtCore import QSettings

# 创建 QSettings 对象,参数为 组织名 和 应用名[reference:65]
settings = QSettings("MyCompany", "MyApp")

# 保存设置
settings.setValue("mainwindow/geometry", self.saveGeometry())
settings.setValue("mainwindow/state", self.saveState())

# 加载设置
geometry = settings.value("mainwindow/geometry")
if geometry:
self.restoreGeometry(geometry)

---------------------------------------------------------------------------------------------------------------------------------

注意事项

  • 信号与槽的参数类型:信号发射的参数个数可以多于槽函数接收的参数,但反之不行。多余的参数会被忽略。

  • 多线程安全:再次强调,绝对不要在子线程中直接操作 GUI 控件,这是导致程序崩溃或出现不可预知错误的常见原因。

  • QThread的生命周期:确保QThread对象不会被过早销毁。通常将其设为所在窗口的子对象,或将其引用保存为实例变量(如self.thread)。

  • QTimer的精度:QTimer的精度依赖于底层操作系统和系统负载,不适用于需要高精度计时的场景(如音乐节拍器)。对于高精度计时,应使用QElapsedTimer

  • QFile的编码:QFile默认以二进制模式操作。读写文本文件时,建议使用QTextStream并指定编码(如stream.setCodec("UTF-8"))以避免乱码。

  • QSettings的存储位置:QSettings的存储位置是平台相关的。你无需关心具体存储在哪里,只需通过统一的 API 读写即可。

http://www.jsqmd.com/news/1149827/

相关文章:

  • Apache HttpClient 4.5 双向SSL认证:修复SSLPeerUnverifiedException的3步排错法
  • M1卡 4种常见控制字节组合实战:从门禁到消费卡的安全配置对比
  • CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写
  • tElock 0.98 加密壳脱壳:3 种方法对比与 CRC 校验绕过实战
  • CTF 安卓逆向 APK 实战:3 种方法定位并解密 Timer 题目中的 Flag
  • Vulnhub Zico2 靶场:phpLiteAdmin 1.9.3 数据库文件写入 Webshell 的 3 种利用方式
  • 卡巴斯基安装错误 27300 (klim6.sys) 深度排查:从 0x8007007e 到残留网络驱动的 3 步根因定位法
  • 企业全员营销短视频统一管理技术方案解析:架构、痛点与矩阵通系统解构
  • 如何快速配置League-Toolkit:英雄联盟自动化助手的完整指南
  • CVE-2017-3506 与 CVE-2017-10271 对比分析:从补丁绕过看 2 次漏洞演进
  • Windows防撤回终极指南:一键破解微信/QQ/TIM撤回限制
  • AD7490与PIC18F47Q10构建高精度数据采集系统
  • 如何高效提升游戏体验:智能助手的3大场景优化技巧
  • ExifToolGUI:专业级照片元数据管理解决方案深度探索
  • BugkuCTF 安卓逆向:APK反编译与JEB/JD-GUI 3.5.0实战,3步定位关键校验逻辑
  • MSP432与DTH-08实现可靠信号状态控制
  • 2026网站生成工具:新手入门、零代码自动建站平台盘点
  • 业务逻辑漏洞防御:从1个付费下载绕过案例看后端校验的5个关键点
  • ISCC 2022 Web 题解:5类 PHP 反序列化漏洞实战与 3 种绕过技巧剖析
  • Apache POI 5.5.1 安全配置:规避CVE-2025-31672等3大常见漏洞
  • 3类XSS漏洞防御方案对比:从输入过滤到CSP策略的实战效果分析
  • AI 元数据管理:自动给表和字段打标签,让数据目录活起来
  • WinUtil:5个核心功能彻底改变您的Windows管理体验
  • OBS背景移除插件深度指南:AI虚拟绿幕的专业配置与性能优化
  • PHP 8.2 RCE 漏洞实战:3 种常见危险函数利用与 5 种过滤绕过技巧
  • B/S 架构电商平台非功能需求设计:从 6 大维度保障高并发与数据安全
  • 2026小程序制作AI工具选型指南:自然对话式制作工具、零代码小程序制作工具汇总
  • 【毕业设计】SpringBoot+Vue+MySQL 船舶维保管理系统平台源码+数据库+论文+部署文档
  • 免费获取A股数据的终极方案:Python通达信接口MOOTDX完全指南
  • 如何用500元预算打造一台会思考的轮腿机器人?