PyQt6-第01讲-环境搭建与第一个窗口
PyQt6 客户端编程从入门到实战 第 1 讲 | 环境搭建与第一个 PyQt6 窗口本讲目标把环境搭好理解 QApplication / QWidget / 事件循环这三个最基础也最容易被跳过的概念跑出你的第一个窗口。配套代码cases/c01_hello_window.py一、先回答一个问题为什么选 PyQt6做 Python 桌面的路只有三条先花两分钟把选型说清楚免得写到一半推倒重来。方案优势代价适合Tkinter标准库自带零安装界面停留在 2005 年控件少、样式难调只给自己用的小工具PyQt6 / PySide6控件齐全、样式可控、跨平台、性能好学习曲线比 Tkinter 陡要做能交付给别人用的软件Electron / WebView前端技术栈、UI 漂亮一个空窗口就占 100MB 内存团队里有前端选 PyQt6 的核心原因Qt 这个框架已经活了三十多年你遇到的所有问题几乎都有人问过。表控件、树控件、图表、数据库绑定、打印、拖拽、多线程全都是框架内置的不需要自己造。PyQt6 和 PySide6 怎么选两者 API 几乎一模一样PySide6 是 Qt 官方绑定PyQt6 是 Riverbank 公司出的。唯一要注意的是授权PyQt6 是 GPL 授权。自己用、开源项目、公司内部工具都没问题如果你要做闭源商业软件对外销售要么买 PyQt 的商业授权要么改用 LGPL 的 PySide6。本课程用 PyQt6代码改成 PySide6 基本只改 import 那一行。二、环境搭建5 分钟1. Python 版本建议3.10 及以上。PyQt6 从 6.0 起就不支持 Python 3.6/3.7 了。命令行确认一下python--version# Python 3.13.122. 用 PyCharm 建项目File → New Project位置随便选关键是下面这一栏勾选Create a virtualenv解释器类型选Virtualenv。为什么要用虚拟环境因为 Qt 的版本依赖很敏感。你电脑上可能同时有别的项目在用 PySide2、PyQt5全局安装会互相打架。虚拟环境让每个项目各自一套依赖互不影响。3. 装依赖打开 PyCharm 底部的 Terminal执行pipinstallPyQt6 PyQt6-ChartsPyQt6-Charts是图表模块它不在 PyQt6 主包里第 15、16 讲要用建议现在一起装上。装完验证一下python-cfrom PyQt6.QtCore import QT_VERSION_STR; print(Qt, QT_VERSION_STR)# Qt 6.7.3看到版本号就说明环境好了。4. 国内网络加速如果pip install卡着不动PyQt6 的运行时包接近 80MB换镜像pipinstallPyQt6 PyQt6-Charts-ihttps://pypi.tuna.tsinghua.edu.cn/simple三、第一个窗口完整代码新建c01_hello_window.py把下面这段敲进去建议手敲不要复制importsysfromPyQt6.QtCoreimportQtfromPyQt6.QtGuiimportQFontfromPyQt6.QtWidgetsimportQApplication,QLabel,QVBoxLayout,QWidgetclassHelloWindow(QWidget):最小可用窗口继承 QWidget往里面塞一个居中标签def__init__(self):super().__init__()# ---- 1. 窗口自身的属性 ----self.setWindowTitle(我的第一个 PyQt6 程序)self.resize(480,300)# ---- 2. 创建控件 ----self.labelQLabel(Hello, PyQt6!,self)self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)fontQFont()font.setPointSize(22)font.setBold(True)self.label.setFont(font)# ---- 3. 把控件交给布局管理 ----rootQVBoxLayout(self)root.addWidget(self.label)if__name____main__:appQApplication(sys.argv)windowHelloWindow()window.show()sys.exit(app.exec())在 PyCharm 里右键 →Run c01_hello_window你会看到一个白底窗口中间写着大号加粗的Hello, PyQt6!。窗口可以拖拽缩放 —— 注意文字始终居中这就是布局的功劳后面第 2 讲细讲。四、三个必须搞懂的类代码只有二十来行但有三层概念一层没搞清后面就会一直困惑。1. QApplication整个程序的总管appQApplication(sys.argv)它做了三件事初始化 Qt 的底层资源字体、绘图上下文、平台插件解析命令行参数sys.argv传给它Qt 会识别一些自带参数维护事件循环铁律任何控件在被创建之前QApplication 必须已经存在。这是新手第一个高频崩溃点——把QApplication写在控件创建之后程序会直接崩掉QWidget: Must construct a QApplication before a QWidget另外一个程序只能有一个 QApplication 实例。想开第二个窗口不要新建 QApplication再new一个窗口类就行。2. QWidget所有可视控件的祖宗QWidget既是窗口也是控件的基类。QLabel、QPushButton、QTableWidget全都继承自它。所以QWidget直接实例化 → 得到一个空窗口class MyWindow(QWidget)→ 自定义窗口QLabel(文字, self)里的self→ 这个标签的父控件父控件决定了三件事子控件显示在谁身上、子控件随父控件一起销毁、子控件的坐标相对谁。3. 布局别用 setGeometry新手最容易写的是这个labelQLabel(文字,self)label.setGeometry(100,120,200,40)# 坐标 尺寸硬编码能跑但窗口一放大控件还钉在原地右边一大片留白换台不同 DPI 的电脑位置就错乱了。正确做法是把控件交给布局管理器rootQVBoxLayout(self)# 创建一个竖向布局装到 self 上root.addWidget(self.label)# 控件加进去QVBoxLayout(self)这一行的含义是给 self 设一个竖向布局之后所有加进来的控件Qt 会自动算位置、自动算尺寸、缩放时自动重排。这一条是本课程后面所有界面的基础。五、事件循环为什么最后一行那么奇怪sys.exit(app.exec())很多人的疑问是window.show()之后窗口不是已经显示了吗为什么还要app.exec()因为窗口显示出来只是画了一帧。你要让它活起来——能响应鼠标、能打字、能重绘——必须有一个循环不停地在跑while True: 从操作系统取出一个事件点击/按键/重绘 找到应该处理它的控件 调用对应的处理函数app.exec()就是这个循环。它阻塞在那里直到你关闭所有窗口或调用quit()才返回。所以写了exec()程序进入循环界面响应关闭窗口后循环结束程序退出 ✔不写exec()程序执行完最后一行直接退出窗口一闪而过 ✘这就是窗口闪一下就没了的原因sys.exit(...)是把exec()的返回值退出码传给系统让退出状态规范。不写也不影响运行但写了更规范。六、四个新手必踩的坑坑 1窗口一闪而过多半是漏了app.exec()或者把window写成了局部变量被提前回收。还有一个可能你加过QTimer.singleShot(xxx, app.quit)忘了删。坑 2QLabel建了但看不见忘了传父控件也没加进布局。控件没有父窗口时是独立窗口不会出现在你的窗口里。要么QLabel(文字, self)要么layout.addWidget(label)。坑 3中文显示成方框Windows 上极少见。Linux 下装中文字体即可Ubuntusudo apt install fonts-wqy-microhei。坑 4PyCharm 里运行报ModuleNotFoundError: No module named PyQt6装到了系统 Python 而不是项目虚拟环境。检查右下角解释器是不是项目那个 venv或者干脆在 Terminal 里pip install PyQt6再跑。七、小结这一讲只做了三件事但都是地基环境PyCharm 虚拟环境 PyQt6和PyQt6-Charts三个类QApplication总管 事件循环、QWidget一切控件的基类、布局管理器一个循环app.exec()让界面活起来现在你的窗口里只有一个居中的标签。真实软件的界面是十几个控件一层层排出来的——按钮在哪一行、输入框占多宽、窗口缩放时谁跟着变这些全靠布局管理。下一讲把布局彻底讲清做出一个像模像样的登录界面顺便把为什么我的控件位置全乱了这个最高频问题一次性解决。本讲是《PyQt6 客户端编程从入门到实战》专栏的第 1 讲免费试读。专栏共 22 讲、22 个可运行案例配套完整 PyCharm 工程涵盖自动化办公、数据库、数据可视化、文件自动化与打包发布。

相关新闻

DLO 激光里程计部署与 DUFOMap 动态点云剔除实战(附开源代码)

DLO 激光里程计部署与 DUFOMap 动态点云剔除实战(附开源代码)

前言 最近在学习激光 SLAM,尝试在 ROS 2 Gazebo 环境下部署 DLO(Direct LiDAR Odometry)激光里程计,并进一步研究动态环境中的点云处理问题。 在实际实验过程中,我发现一个值得研究的问题:动态物体会干扰…

2026/10/16 9:29:30 阅读更多 →
想去北京亨得利腕表服务中心?2026年10月整理门店地址与出行路线

想去北京亨得利腕表服务中心?2026年10月整理门店地址与出行路线

在北京生活的表主,大多都有这样的体会:这座城市地域跨度很大,从海淀、西城、东城,到通州、顺义、昌平,跨区通勤往往就要耗费不少时间。如果腕表出现走时偏差、磕碰损伤、防水异常等问题,想要带着腕表出门检…

2026/10/16 9:29:30 阅读更多 →
你缺的不是客户,而是逼单的能力

你缺的不是客户,而是逼单的能力

做销售最扎心的是什么? 不是没客户,而是微信加了一大堆,方案改了好几版,最后却没几个人下单。别人手里的客户和你差不多,业绩却是你的好几倍。 差距在哪?很多时候,不是你不会找客户,…

2026/10/16 9:29:30 阅读更多 →

最新新闻

从RNN到Transformer:Attention机制原理与工程实践

从RNN到Transformer:Attention机制原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:18:27 阅读更多 →
AIGC检测时代,本科生论文如何用降AI率工具与WPS AI写出自然人风格?

AIGC检测时代,本科生论文如何用降AI率工具与WPS AI写出自然人风格?

2. 写在最前面:这个标题,戳中了多少本科生的痛点 “导师又让重写”——这几个字,我估计在座各位本科阶段都见过。尤其是理工科写课程报告、文科写结课论文的时候,辛苦攒出来的几千字,导师一句“语言不够凝练”“表达太…

2026/10/17 13:18:27 阅读更多 →
感知机原理与三种Python实现:NumPy、scikit-learn与PyTorch可视化对比

感知机原理与三种Python实现:NumPy、scikit-learn与PyTorch可视化对比

说到感知机算法原理,我见过很多开发者的第一反应是:这算法不是已经被深度学习淘汰了吗?实际情况恰恰相反。感知机虽然简单到只有一行决策规则,但它几乎是理解一切神经网络的基础原型。我第一次认真手写感知机代码时,最…

2026/10/17 13:18:27 阅读更多 →
Java集合框架核心解析:从ArrayList到HashMap的底层原理与习题自证法

Java集合框架核心解析:从ArrayList到HashMap的底层原理与习题自证法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:18:27 阅读更多 →
Claude Code 自定义模型切换痛点与 CC Switch 配置管理实践

Claude Code 自定义模型切换痛点与 CC Switch 配置管理实践

很多人一开始接触 Claude Code 的时候都会问:这玩意儿是不是只能用自带的模型?实际上完全可以把它接成自定义模型,只要你愿意处理那一堆破配置。我之前就干过这种蠢事:为了在家里的开发机上把 Claude Code 接到某个支持自定义API的…

2026/10/17 13:18:27 阅读更多 →
基于MP2642GR-Z与STM32F446RE的两串电池被动均衡方案设计与实现

基于MP2642GR-Z与STM32F446RE的两串电池被动均衡方案设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 13:17:26 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →