当前位置:首页>python>Python学习第18天:PyQt6窗口设计基础

Python学习第18天:PyQt6窗口设计基础

  • 2026-09-16 16:28:04
Python学习第18天:PyQt6窗口设计基础

PyQt6窗口设计基础

今天学习一下 PyQt6 窗口设计全部基础知识点。 从窗口基础属性、个性化美化、信号与槽机制、多窗口跳转、UI与逻辑代码分离五大核心模块,搭配完整可运行代码案例。

一、窗口的属性列表

在开始所有窗口开发之前,我们首先要明确:PyQt6 中所有窗口、控件都基于QWidget基类,窗口本身自带大量内置属性,涵盖窗口命名、尺寸、标题、图标、背景、透明度、窗口形态、交互规则等全方面属性。 后续所有窗口美化、功能开发,都是基于修改窗口自身属性、绑定内置/自定义信号槽来实现。

二、窗口的个性化设置

这部分是窗口开发最常用的内容,对应思维导图里所有API函数,我全部拆分讲解、附带完整可直接运行的代码示例。

2.1 基本属性设置

对应3个核心基础API,是每一个窗口程序必写内容:

  1. setObjectName():设置窗口的对象名称,用于控件唯一标识、样式表精准选择控件
  2. setWindowTitle():设置窗口顶部标题栏名称
  3. resize(width, height):修改窗口默认打开的宽高尺寸

2.2 更换窗口图标

API:setWindowIcon() 用于自定义窗口左上角、任务栏的程序图标,需要传入QIcon图标对象,支持本地图片路径加载。

2.3 设置窗口背景

思维导图中标注了两种官方实现方案,两种方法都给你完整代码:

  1. 方案1:setStyleSheet() 函数(QSS样式表,最常用、写法最简单) 直接通过CSS风格语法设置背景颜色、背景图片,适配绝大多数场景。
  2. 方案2:QPalette 调色板类设置 Qt原生调色板方案,通过调色板对象给窗口设置背景,兼容性更强。

2.4 控制窗口透明度

API:setWindowOpacity(float) 参数为0.0~1.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 分离开发规范

标准分层结构:

  1. UI层代码:只负责界面绘制、控件创建、布局排版、窗口基础属性设置,完全不写任何业务功能逻辑。一般由qtdesigner可视化UI设计工具生成,单独.py文件存放。
  2. 逻辑层代码:只负责业务功能、信号槽绑定、数据处理、窗口交互、业务函数编写,不直接手写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())

总结

  1. 窗口基础属性与全量个性化美化API,两套背景设置方案
  2. PyQt核心基石:信号与槽机制原理、自定义槽函数用法
  3. 多窗口全流程开发:窗口创建、启动入口配置、跨窗口信号联动跳转
  4. 工程化开发规范:UI界面与业务逻辑代码彻底分离的标准写法

文末小互动

后续会继续更新PyQt6全套控件教程、QSS美化全套技巧、完整桌面软件项目实战,感兴趣的小伙伴可以持续关注!

OpenClaw 小龙虾零基础完整安装文档

养龙虾必备-ClawX 开源 AI 研究助手

Python学习第17天:PyQt6基础入门(第一个窗体+Qt Designer使用)

最新文章

随机文章