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

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性

PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。

1. 跨平台GUI开发

跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux等多个平台,开发的应用可以轻松移植。

统一代码库:只需维护一套代码,减少跨平台开发的复杂性

2. 丰富的UI组件

多样化控件:PyQt提供按钮、文本框、表格等丰富的UI组件,满足复杂界面需求。

高度可定制:支持自定义控件和样式,适应不同设计需求。

3. 强大的功能扩展

与Python生态集成:PyQt能与NumPy、Pandas等Python库无缝结合,增强应用功能。

多线程支持:内置多线程工具,帮助开发响应迅速的应用程序。

4. 良好的社区和文档支持

活跃社区PyQt和Qt拥有活跃的社区,提供丰富的学习资源

详细文档官方文档详尽,便于学习和解决问题。

5. 商业和开源项目中的应用

广泛应用:PyQt适用于商业软件、科研工具、教育软件等多种场景。

开源项目:许多开源项目使用PyQt,学习后可以参与或借鉴这些项目

6. 职业发展

市场需求掌握PyQt能提升在GUI开发领域的竞争力,增加职业机会。

技能提升:学习PyQt有助于理解GUI开发和事件驱动编程,提升整体编程能力。

7. 快速原型开发

高效开发:PyQt适合快速构建原型,便于迭代和测试。

可视化设计Qt Designer工具支持拖拽式界面设计,加速开发过程。

PyQt的学习路线

一、PyQt基础准备

1. 版本选择

PyQt5 vs PyQt6:PyQt6是最新版本(2021年发布),但PyQt5生态更成熟,推荐从PyQt5开始学习(语法差异不大)。

PySide:Qt官方提供的Python绑定(Apache协议,商业友好),语法与PyQt几乎一致,企业项目可优先考虑

2. 安装
# 安装PyQt5
pip install pyqt5 pyqt5-tools# 安装PyQt6
pip install pyqt6 pyqt6-tools

3. 核心模块

  • QtWidgets:按钮、文本框等控件

  • QtCore:信号/槽、多线程、文件操作

  • QtGui:绘图、字体、颜色

  • QtDesigner:可视化界面设计工具

二、快速入门示例

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidgetapp = QApplication(sys.argv)  # 创建应用实例
window = QWidget()            # 创建窗口
window.setWindowTitle("PyQt入门")
window.setGeometry(100, 100, 300, 200)  # x, y, width, heightlabel = QLabel("Hello PyQt!", window)
label.move(100, 80)           # 控件位置window.show()                 # 显示窗口
sys.exit(app.exec_())         # 启动事件循环

三、核心学习路径

1. Qt Designer可视化设计
  • 启动工具:安装后通过命令行 designer 启动。

  • 拖拽布局:设计界面并保存为 .ui 文件。

  • 转换UI文件为Python代码

pyuic5 input.ui -o output.py
  • 动态加载UI文件(推荐):
from PyQt5 import uic
class MyWindow(QWidget):def __init__(self):super().__init__()uic.loadUi("my_ui.ui", self)  # 直接加载UI文件
2. 布局管理
  • 水平布局(QHBoxLayout)

  • 垂直布局(QVBoxLayout)

  • 网格布局(QGridLayout)

  • 示例:

layout = QVBoxLayout()
layout.addWidget(QPushButton("按钮1"))
layout.addWidget(QPushButton("按钮2"))
window.setLayout(layout)  # 自动适配窗口大小
3. 信号与槽机制
  • 连接内置信号
button.clicked.connect(self.on_button_click)
  • 自定义信号
class MyWidget(QWidget):custom_signal = pyqtSignal(str)  # 定义信号def emit_signal(self):self.custom_signal.emit("数据")
4. 多线程处理
  • 使用QThread避免界面卡顿:
class Worker(QThread):finished = pyqtSignal(str)def run(self):# 耗时操作self.finished.emit("任务完成")worker = Worker()
worker.finished.connect(self.update_ui)
worker.start()

四、进阶开发技巧

1. 样式定制(QSS)
  • 修改控件外观
button.setStyleSheet("""QPushButton {background-color: #4CAF50;border-radius: 5px;color: white;}QPushButton:hover { background-color: #45a049; }
""")
  • 加载外部QSS文件
with open("style.qss", "r") as f:app.setStyleSheet(f.read())
2. 数据绑定与图表

- PyQtGraph:高性能数据可视化库

import pyqtgraph as pg
plot_widget = pg.PlotWidget()
plot_widget.plot([1,2,3], [4,5,6])
  • Qt Charts:官方图表模块
from PyQt5.QtChart import QChart, QLineSeries
series = QLineSeries()
series.append(0, 6); series.append(2, 4)
chart = QChart()
chart.addSeries(series)
3. 数据库集成
  • SQLite操作:
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("mydb.sqlite")
if db.open():query = QSqlQuery()query.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")

五、部署与打包

1. 打包为EXE
  • 使用 PyInstaller
pyinstaller --windowed --icon=app.ico main.py
  • 解决常见问题:

    • 添加资源文件(图片、QSS)需处理路径问题
    • 使用 sys._MEIPASS 处理冻结路径:
def resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)

六、学习资源推荐

1. 官方文档
  • PyQt5官方文档

  • Qt官方文档

2. 书籍
  • 《PyQt5快速开发与实战》

  • 《Rapid GUI Programming with Python and Qt》

3. 实战项目
  • 计算器

  • 文本编辑器(支持语法高亮)

  • 数据可视化工具(读取CSV绘图)

  • 网络爬虫GUI(集成Requests和BeautifulSoup)

七、常见问题

  • Q: PyQt5和PySide2如何选择?
    A: 个人项目用PyQt5,商业项目建议PySide6(避免GPL协议风险)。

  • Q: 界面卡顿怎么办?
    A: 耗时操作必须放在子线程(QThread),通过信号更新UI。

  • Q: 打包后找不到图标或样式?
    A: 使用PyInstaller的 --add-data 参数添加资源文件。

相关文章:

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…...

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时,只能提供同步的时刻信息,无法在任务之间进行数据传输。要实现任务间的数据传输,一般使用两种方式: 1. 全局变量 在 RTOS 中使用全局变量时,必须保证每个任务…...

Hive之数据定义DDL

Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …...

ROS-SLAM

基本概念 SLAM 即 Simultaneous Localization and Mapping,中文名为同时定位与地图构建,是机器人、自动驾驶、增强现实等领域中的关键技术。 在未知环境中,搭载特定传感器的主体(如机器人、无人机等)在运动过程中&am…...

网络攻防实战指北专栏讲解大纲与网络安全法

专栏 本专栏为网络攻防实战指北,大纲如下所示 进度:目前已更完准备篇、HTML基础 计划:所谓基础不牢,地动山摇。所以下一步将持续更新基础篇内容 讲解信息安全时,结合《中华人民共和国网络安全法》(以下简…...

Spark的基本概念

个人博客地址:Spark的基本概念 | 一张假钞的真实世界 编程接口 RDD:弹性分布式数据集(Resilient Distributed Dataset )。Spark2.0之前的编程接口。Spark2.0之后以不再推荐使用,而是被Dataset替代。Dataset&#xff…...

效用曲线的三个实例

效用曲线的三个实例 文章目录 效用曲线的三个实例什么是效用曲线风险与回报:投资决策消费选择:价格与质量的平衡程序员绩效评估:准时与程序正确性 分析- 风险与回报:投资决策分析- 消费选择:价格与质量的平衡- 程序员绩…...

JavaScript面向对象编程:Prototype与Class的对比详解

JavaScript面向对象编程:Prototype与Class的对比详解 JavaScript面向对象编程:Prototype与Class的对比详解引言什么是JavaScript的面向对象编程?什么是Prototype?Prototype的定义Prototype的工作原理示例代码优点缺点 什么是JavaS…...

neo4j-community-5.26.0 create new database

1.edit neo4j.conf 把 # The name of the default database initial.dbms.default_databasehonglouneo4j # 写上自己的数据库名称 和 # Name of the service #5.0 server.windows_service_nameneo4j #4.0 dbms.default_databaseneo4j #dbms.default_databaseneo4jwind serve…...

pytorch实现门控循环单元 (GRU)

人工智能例子汇总:AI常见的算法和例子-CSDN博客 特性GRULSTM计算效率更快,参数更少相对较慢,参数更多结构复杂度只有两个门(更新门和重置门)三个门(输入门、遗忘门、输出门)处理长时依赖一般适…...

有没有个性化的UML图例

绿萝小绿萝 (53****338) 2012-05-10 11:55:45 各位大虾,有没有个性化的UML图例 绿萝小绿萝 (53****338) 2012-05-10 11:56:03 例如部署图或时序图的图例 潘加宇 (35***47) 2012-05-10 12:24:31 "个性化"指的是? 你的意思使用你自己的图标&…...

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…...

Vue3.0实战:大数据平台可视化

文章目录 创建vue3.0项目项目初始化项目分辨率响应式设置项目顶部信息条创建页面主体创建全局引入echarts和axios后台接口创建express销售总量图实现完整项目下载项目任何问题都可在评论区,或者直接私信即可。 创建vue3.0项目 创建项目: vue create vueecharts选择第三项:…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂,一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

语音识别播报人工智能分类垃圾桶(论文+源码)

2.1 需求分析 本次语音识别播报人工智能分类垃圾桶,设计功能要求如下∶ 1、具有四种垃圾桶,分别为用来回收厨余垃圾,有害垃圾,可回收垃圾,其他垃圾。 2、当用户语音说出“旧报纸”,“剩菜”等特定词语时…...

MVC、MVP和MVVM模式

MVC模式中,视图和模型之间直接交互,而MVP模式下,视图与模型通过Presenter进行通信,MVVM则采用双向绑定,减少手动同步视图和模型的工作。每种模式都有其优缺点,适合不同规模和类型的项目。 ### MVVM 与 MVP…...

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…...

负载均衡器高可用部署

Haproxy 和 Keepalived安装Haproxy配置文件准备Keepalived配置及健康检查启动Haproxy & Keepalived服务继续上一篇文章《K8S集群架构及主机准备》,下面介绍负载均衡器搭建过程 Haproxy 和 Keepalived安装 在负载均衡器两个主机上安装即可 apt install haproxy keepalived…...

属性编程与权限编程

问题 如何获取文件的大小,时间戳以及类型等信息? 再论 inode 文件的物理载体是硬盘,硬盘的最小存储单元是扇区 (每个扇区 512 字节) 文件系统以 块 为单位(每个块 8 个扇区) 管理文件数据 文件元信息 (创建者、创建日期、文件大小&#x…...

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域,周围八个格子分别放置了不同的奖品名称,中间是一个 “开始抽奖” 的按钮。点击按钮后,抽奖区域的格子会快速滚动,颜色不断变化&#xf…...

R语言绘制有向无环图(DAG)

有向无环图(Directed Acyclic Graph,简称DAG)是一种特殊的有向图,它由一系列顶点和有方向的边组成,其中不存在任何环路。这意味着从任一顶点出发,沿着箭头方向移动,你永远无法回到起始点。 从流…...

报错Too many open files

1、先查看系统最大打开文件数 # 查看当前系统打开文件最大数 # ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signal…...

Spring Web MVC基础第一篇

目录 1.什么是Spring Web MVC? 2.创建Spring Web MVC项目 3.注解使用 3.1RequestMapping(路由映射) 3.2一般参数传递 3.3RequestParam(参数重命名) 3.4RequestBody(传递JSON数据) 3.5Pa…...

129.求根节点到叶节点数字之和(遍历思想)

Problem: 129.求根节点到叶节点数字之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 直接利用二叉树的先序遍历,将遍历过程中的节点值先利用字符串拼接起来遇到根节点时再转为数字并累加起来,在归的过程中&#xf…...

unity中的动画混合树

为什么需要动画混合树,动画混合树有什么作用? 在Unity中,动画混合树(Animation Blend Tree)是一种用于管理和混合多个动画状态的工具,包括1D和2D两种类型,以下是其作用及使用必要性的介绍&…...

AWS EMR使用Apache Kylin快速分析大数据

在AWS Elastic MapReduce(EMR)集群上部署和使用Apache Kylin,以实现对大规模数据集的快速分析,企业可以充分利用云计算的强大资源和Kylin的数据分析能力,实现快速、高效的数据分析。以下是该案例的详细步骤和要点&…...

MySQL存储过程和存储函数_mysql 存储过 call proc_stat_data(3,null)

2)很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。 1.2 数据准备 创建数据库: DEFAULT CHARACTER SET utf8; use test;这里记得设置编码! 创建测试表: DROP…...

spacemacs gnuplot

个人博客地址:spacemacs gnuplot | 一张假钞的真实世界 环境 Ubuntu 16.10Emacs 24 安装过程 spacemacs安装 安装Emacs sudo apt-get install emacs 安装spacemacs (1)如果已经存在Emacs配置文件,首先备份: c…...

Flink2支持提交StreamGraph到Flink集群

最近研究Flink源码的时候,发现Flink已经支持提交StreamGraph到集群了,替换掉了原来的提交JobGraph。 新增ExecutionPlan接口,将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改,从JobGraph改成了接口Executio…...

Kotlin 使用 Springboot 反射执行方法并自动传参

在使用反射的时候,执行方法的时候在想如果Springboot 能对需要执行的反射方法的参数自动注入就好了。所以就有了下文。 知识点 获取上下文通过上下文获取 Bean通过上下文创建一个对象,该对象所需的参数由 Springboot 自己注入 创建参数 因为需要对反…...