PyQt6窗口设计基础
今天学习一下 PyQt6 窗口设计全部基础知识点。 从窗口基础属性、个性化美化、信号与槽机制、多窗口跳转、UI与逻辑代码分离五大核心模块,搭配完整可运行代码案例。
一、窗口的属性列表
在开始所有窗口开发之前,我们首先要明确:PyQt6 中所有窗口、控件都基于QWidget基类,窗口本身自带大量内置属性,涵盖窗口命名、尺寸、标题、图标、背景、透明度、窗口形态、交互规则等全方面属性。 后续所有窗口美化、功能开发,都是基于修改窗口自身属性、绑定内置/自定义信号槽来实现。
二、窗口的个性化设置
这部分是窗口开发最常用的内容,对应思维导图里所有API函数,我全部拆分讲解、附带完整可直接运行的代码示例。
2.1 基本属性设置
对应3个核心基础API,是每一个窗口程序必写内容:
setObjectName():设置窗口的对象名称,用于控件唯一标识、样式表精准选择控件setWindowTitle():设置窗口顶部标题栏名称resize(width, height):修改窗口默认打开的宽高尺寸
2.2 更换窗口图标
API:setWindowIcon() 用于自定义窗口左上角、任务栏的程序图标,需要传入QIcon图标对象,支持本地图片路径加载。
2.3 设置窗口背景
思维导图中标注了两种官方实现方案,两种方法都给你完整代码:
- 方案1:
setStyleSheet() 函数(QSS样式表,最常用、写法最简单) 直接通过CSS风格语法设置背景颜色、背景图片,适配绝大多数场景。 - 方案2:
QPalette 调色板类设置 Qt原生调色板方案,通过调色板对象给窗口设置背景,兼容性更强。
2.4 控制窗口透明度
API:setWindowOpacity(float) 参数为0.0~1.0之间的浮点数:
0.0:窗口完全透明、不可见 可以实现窗口渐变、悬浮透明窗口等特效。
2.5 设置窗口样式
API:setWindowFlags() 用于修改窗口的整体形态、系统边框、置顶属性、窗口功能按钮(最小化/最大化/关闭按钮隐藏)、无边框窗口等所有窗口基础形态。
完整综合代码案例
下面这段代码,一次性封装了上面所有窗口个性化设置API,你直接复制即可运行,每一行都带详细注释:

import sysfrom PyQt6.QtWidgets import QApplication, QWidgetfrom PyQt6.QtGui import QIcon, QPalette, QColorclass BaseWindow(QWidget):def __init__(self):super().__init__()self.init_window()def init_window(self):# ========== 1. 基本属性设置 ==========self.setObjectName("MainWindow") # 设置窗口对象名self.setWindowTitle("PyQt6窗口个性化设置演示") # 设置窗口标题self.resize(800, 500) # 设置窗口宽高:宽800px,高500px# ========== 2. 更换窗口图标 ==========# 替换为你本地图片路径即可,支持png、ico格式self.setWindowIcon(QIcon("icon.png"))# ========== 3. 设置窗口背景 方案1:setStyleSheet样式表 ==========# 方式A:纯色背景# self.setStyleSheet("background-color: rgb(240, 248, 255);")# 方式B:本地图片背景# self.setStyleSheet("background-image: url(bg.png);")# ========== 3. 设置窗口背景 方案2:QPalette调色板 ========== palette = QPalette() palette.setColor(QPalette.ColorRole.Window, QColor(220, 240, 255))self.setPalette(palette)# ========== 4. 控制窗口透明度 ==========self.setWindowOpacity(0.95) # 0.95不透明度,轻微透明效果# ========== 5. 设置窗口样式 flags ==========# 示例:窗口置顶 + 去除窗口默认边框# from PyQt6.QtCore import Qt# self.setWindowFlags(Qt.WindowType.WindowStaysOnTopHint | Qt.WindowType.FramelessWindowHint)if __name__ == "__main__": app = QApplication(sys.argv) window = BaseWindow() window.show() sys.exit(app.exec())
三、信号与槽
3.1 核心基础概念
信号与槽是PyQt6(包含PyQt5)整个框架中,对象之间通信、程序交互的唯一基础机制。
- 信号:事件触发源(比如按钮点击、窗口打开、数值改变、鼠标操作)
- 工作原理:发送者(控件)将信号发送给接收者(窗口/控件),接收者收到信号后,自动调用绑定好的槽函数,完成业务逻辑。
3.2 自定义槽 + 信号绑定
思维导图重点标注知识点:自定义槽的本质就是一个自定义Python函数。 我们开发中90%的场景,都需要自己写业务函数(自定义槽),再把它绑定到控件的对应信号上,实现交互功能。
代码案例:自定义信号槽绑定演示
最经典的按钮点击场景,完整可运行代码:
import sysfrom PyQt6.QtWidgets import QApplication, QWidget, QPushButtonclass SignalSlotWindow(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.setWindowTitle("信号与槽演示")self.resize(400, 300)# 创建按钮控件 btn = QPushButton("点击我触发自定义槽函数", self)# 核心:按钮的点击信号 绑定 我们自己写的自定义槽函数 btn.clicked.connect(self.my_custom_slot)# ========== 自定义槽函数(本质:自定义普通函数) ==========def my_custom_slot(self):print("按钮被点击!自定义槽函数成功执行!")if __name__ == "__main__": app = QApplication(sys.argv) window = SignalSlotWindow() window.show() sys.exit(app.exec())
四、多窗口设计
日常桌面软件几乎全是多窗口程序(主窗口、子窗口、设置窗口、弹窗窗口),对应思维导图3大核心知识点:创建多窗口、设置启动窗口、多窗口之间关联通信。
4.1 创建多窗口
基于QWidget基类,每一个窗口都单独封装成一个Python类,一个类对应一个独立窗口,实现窗口代码解耦。
4.2 设置启动窗口
规则:为程序启动入口的主窗口.py文件,添加__main__程序入口方法。 程序运行时,只会执行__main__代码块内的窗口,作为整个软件的启动首窗口。
4.3 多窗口之间的关联
多窗口跳转、互相调用的唯一方案:通过发送信号、调用槽函数完成窗口联动。 在主窗口定义槽函数,实现子窗口的创建、显示、隐藏;再把按钮点击等信号,绑定到这个窗口跳转槽函数上。
多窗口跳转完整代码案例
包含主窗口、子窗口,完整跨窗口联动:
import sysfrom PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel# ========== 子窗口类(独立窗口1) ==========class SubWindow(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.setWindowTitle("子窗口")self.resize(300, 200)self.label = QLabel("这是多窗口程序的子窗口", self)# ========== 主窗口类(程序启动窗口) ==========class MainWindow(QWidget):def __init__(self):super().__init__()self.sub_window = None# 子窗口实例对象self.init_ui()def init_ui(self):self.setWindowTitle("多窗口设计演示")self.resize(500, 300)# 跳转按钮 btn = QPushButton("打开子窗口", self) btn.clicked.connect(self.open_sub_window) # 信号绑定窗口跳转槽函数# 自定义槽函数:实现多窗口打开(窗口关联核心逻辑)def open_sub_window(self):# 首次点击创建子窗口,后续点击直接显示if self.sub_window is None:self.sub_window = SubWindow()self.sub_window.show()# ========== 设置程序启动窗口:__main__ 入口 ==========if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() # 程序默认启动主窗口 main_window.show() sys.exit(app.exec())
五、UI与逻辑代码分离
这是PyQt6商业项目、规范开发的黄金原则。
5.1 为什么要代码分离
原生写法如果把UI界面代码、业务逻辑代码全部写在同一个文件、同一个类里,会出现:
5.2 分离开发规范
标准分层结构:
- UI层代码:只负责界面绘制、控件创建、布局排版、窗口基础属性设置,完全不写任何业务功能逻辑。一般由
qtdesigner可视化UI设计工具生成,单独.py文件存放。 - 逻辑层代码:只负责业务功能、信号槽绑定、数据处理、窗口交互、业务函数编写,不直接手写UI控件代码,只导入UI层的类,继承初始化界面。
5.3 标准分离代码结构模板
# ========== 【1. UI层代码(界面专属,单独文件)】 ==========# ui_main.py 文件,仅存放界面布局、控件、基础属性from PyQt6.QtWidgets import QWidget, QPushButtonclass Ui_MainWindow:def setupUi(self, MainWindow):# 仅做界面搭建:控件创建、布局、基础样式 MainWindow.setWindowTitle("UI逻辑分离演示")self.btn = QPushButton("功能按钮", MainWindow)# ========== 【2. 逻辑层代码(业务专属,主程序文件)】 ==========# main.py 文件,仅存放业务逻辑、信号槽绑定、功能函数import sysfrom PyQt6.QtWidgets import QApplication, QWidgetfrom ui_main import Ui_MainWindow # 导入UI层界面类class MainWindow(QWidget, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self) # 初始化UI界面self.bind_signal_slot() # 所有业务逻辑、信号槽绑定全部写在这里# 全部业务逻辑、自定义槽函数,全部写在逻辑层def bind_signal_slot(self):self.btn.clicked.connect(self.business_function)def business_function(self):print("业务逻辑执行,和UI界面代码完全分离!")# 程序启动入口if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
总结
- 窗口基础属性与全量个性化美化API,两套背景设置方案
- PyQt核心基石:信号与槽机制原理、自定义槽函数用法
- 多窗口全流程开发:窗口创建、启动入口配置、跨窗口信号联动跳转
- 工程化开发规范:UI界面与业务逻辑代码彻底分离的标准写法
文末小互动
后续会继续更新PyQt6全套控件教程、QSS美化全套技巧、完整桌面软件项目实战,感兴趣的小伙伴可以持续关注!
OpenClaw 小龙虾零基础完整安装文档
养龙虾必备-ClawX 开源 AI 研究助手
Python学习第17天:PyQt6基础入门(第一个窗体+Qt Designer使用)