PyQt5核心基础:QWidget基础窗口与布局入门(附完整可运行代码)
哈喽~欢迎来到PyQt5从入门到精通的第二篇!上一篇我们搞定了环境搭建和第一个空白窗口,这一篇我们聚焦QWidget基础窗口的进阶属性和布局管理器入门——解决新手最头疼的“控件位置混乱、窗口缩放后控件错位”问题,全程代码完整可直接运行,新手也能轻松跟上!
一、先回顾:QWidget是什么?
QWidget是PyQt5中所有可视化控件的基类(可以理解为“所有窗口/控件的老祖宗”),我们上一篇创建的空白窗口就是QWidget的实例。它不仅能作为独立窗口使用,还能作为其他控件的容器,掌握它的属性设置是PyQt5界面开发的核心基础。
二、QWidget窗口进阶属性设置(完整代码)
上一篇我们只设置了窗口标题、大小、位置,这一节我们拓展更多实用属性:设置窗口图标、固定窗口大小、窗口置顶、自定义背景色、监听关闭事件等,先上完整代码,再逐行解析。
完整代码:QWidget窗口进阶属性
import sys
# 导入必要控件:QWidget(窗口)、QApplication(应用)、QIcon(图标)
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class MyWindow(QWidget):
def __init__(self):
# 继承QWidget的初始化方法
super().__init__()
# 调用自定义的窗口设置方法
self.init_ui()
def init_ui(self):
# 1. 基础属性(复习)
self.setWindowTitle("QWidget进阶窗口") # 窗口标题
self.resize(400, 300) # 初始大小(宽×高)
self.move(300, 200) # 初始位置(屏幕坐标:左×上)
# 2. 进阶属性:设置窗口图标
# 注意:替换为你本地的图标路径(支持.ico/png/jpg格式)
# 新手提示:可先找一张小图片(比如16×16/32×32像素),放在代码同目录下
self.setWindowIcon(QIcon("icon.png"))
# 3. 进阶属性:固定窗口大小(禁止用户缩放)
# 取消注释以下行,窗口将固定为400×300,无法拖动边缘缩放
# self.setFixedSize(400, 300)
# 4. 进阶属性:窗口置顶(始终显示在其他窗口上方)
self.setWindowFlags(Qt.WindowStaysOnTopHint)
# 5. 进阶属性:设置窗口背景色(浅灰色)
self.setStyleSheet("background-color: #f0f0f0;")
# 6. 进阶:监听窗口关闭事件(比如关闭前弹出提示)
def closeEvent(self, event):
# 这里先简单打印提示,后续会讲弹窗提示
print("你点击了关闭按钮!")
# 允许窗口关闭(如果想阻止关闭,可调用event.ignore())
event.accept()
if __name__ == "__main__":
# 创建应用实例
app = QApplication(sys.argv)
# 创建自定义窗口实例
window = MyWindow()
# 显示窗口
window.show()
# 启动主循环
sys.exit(app.exec_())
代码关键解析
- 类的封装:我们把窗口逻辑封装到
MyWindow类中(继承QWidget),这是PyQt5开发的标准写法,便于后续拓展功能; - 窗口图标:
setWindowIcon(QIcon("图标路径")),新手注意路径要正确(代码和图标同目录可直接写文件名); - 固定大小:
setFixedSize()适合不需要缩放的工具窗口,取消注释即可生效; - 窗口置顶:
Qt.WindowStaysOnTopHint是Qt的内置常量,实现窗口始终在最上层; - 关闭事件:重写
closeEvent()方法,可在窗口关闭前执行自定义逻辑(比如保存数据、弹出确认弹窗)。
运行效果
运行代码后,会弹出一个浅灰色、置顶显示、带自定义图标的窗口,关闭窗口时控制台会打印“你点击了关闭按钮!”。
三、布局管理器入门:解决控件排列混乱问题
新手最容易踩的坑:直接用setGeometry()手动设置控件位置,窗口缩放后控件会错位、重叠。PyQt5提供布局管理器自动管理控件位置,核心是:
- 无需手动设置控件坐标,布局会自动分配空间;
- 窗口缩放时,控件会按比例自适应。
我们先学最基础的两种线性布局:
QVBoxLayout:垂直布局(控件从上到下排列);QHBoxLayout:水平布局(控件从左到右排列)。
完整代码:线性布局实操(带按钮+标签)
import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QPushButton,
QVBoxLayout, QHBoxLayout # 导入布局管理器
)
class LayoutWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("线性布局示例")
self.resize(400, 300)
# 1. 创建控件
label = QLabel("这是一个标签")
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
# 2. 方式1:垂直布局(控件从上到下)
# 创建垂直布局实例
layout = QVBoxLayout()
# 向布局中添加控件(可添加多个)
layout.addWidget(label)
layout.addWidget(btn1)
layout.addWidget(btn2)
# 设置布局的间距(控件之间的距离,可选)
layout.setSpacing(20)
# 设置布局的边距(布局和窗口边缘的距离,可选)
layout.setContentsMargins(50, 50, 50, 50)
# 2. 方式2:水平布局(控件从左到右)
# 取消注释以下代码,替换垂直布局
# layout = QHBoxLayout()
# layout.addWidget(label)
# layout.addWidget(btn1)
# layout.addWidget(btn2)
# 3. 将布局设置到窗口上(核心步骤,否则布局不生效)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = LayoutWindow()
window.show()
sys.exit(app.exec_())代码关键解析
布局使用三步法:
- 创建布局实例(
QVBoxLayout()/QHBoxLayout()); - 用
addWidget()向布局中添加控件; - 用
setLayout()将布局绑定到窗口;
- 创建布局实例(
间距/边距设置:
setSpacing():控件之间的间距(单位:像素);setContentsMargins(左, 上, 右, 下):布局和窗口边缘的距离;
- 自适应效果:运行后拖动窗口边缘缩放,控件会自动调整位置,不会错位。
对比:手动布局 vs 布局管理器
如果用手动布局(label.setGeometry(50,50,100,30)),窗口放大后标签和按钮仍停留在原地;而布局管理器会让控件均匀分布在窗口中,这是开发中必须掌握的核心技巧。
四、综合案例:带布局的多功能窗口(完整代码)
结合本节所有知识点,做一个带图标、置顶、垂直布局的完整窗口:
import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QPushButton,
QVBoxLayout
)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class ComprehensiveWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 窗口基础属性
self.setWindowTitle("综合布局窗口")
self.setWindowIcon(QIcon("icon.png")) # 替换为你的图标路径
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.resize(400, 300)
# 创建控件
title_label = QLabel("PyQt5布局演示")
# 设置标签字体大小(简单美化)
title_label.setStyleSheet("font-size: 18px; font-weight: bold;")
btn_ok = QPushButton("确认")
btn_cancel = QPushButton("取消")
# 创建垂直布局
layout = QVBoxLayout()
layout.addWidget(title_label)
layout.addWidget(btn_ok)
layout.addWidget(btn_cancel)
layout.setSpacing(30)
layout.setContentsMargins(80, 80, 80, 80)
# 绑定布局
self.setLayout(layout)
def closeEvent(self, event):
print("窗口即将关闭!")
event.accept()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ComprehensiveWindow()
window.show()
sys.exit(app.exec_())运行效果:一个置顶的窗口,内部有大号标题标签和两个按钮,垂直排列且间距均匀,窗口缩放时控件自动适配。
五、常见问题排查
- 布局不生效:忘记调用
setLayout(),或布局添加控件后未绑定到窗口; - 图标不显示:图标路径错误(建议将图标放在代码同目录,直接写文件名);
- 窗口无法置顶:部分系统(如macOS)对窗口置顶有权限限制,属正常现象;
- 控件重叠:未使用布局,手动设置的控件坐标重复,优先用布局管理器解决。
总结
- QWidget是PyQt5所有控件的基类,掌握
setWindowIcon()/setFixedSize()等属性可自定义窗口样式; - 布局管理器(QVBoxLayout/QHBoxLayout)是解决控件排列的核心,无需手动设置坐标,支持自适应;
- PyQt5开发建议封装成类,便于后续拓展功能(如监听事件、添加更多控件)。
下一篇我们会深入讲解PyQt5常用基础控件(标签、按钮、输入框)和信号与槽的核心逻辑,记得关注哦~如果有任何问题,评论区留言讨论!