PyQt5核心基础:QWidget窗口属性与线性布局入门

寒烟似雪
1年前发布 /正在检测是否收录...

PyQt5核心基础:QWidget基础窗口与布局入门(附完整可运行代码)

哈喽~欢迎来到PyQt5从入门到精通的第二篇!上一篇我们搞定了环境搭建和第一个空白窗口,这一篇我们聚焦QWidget基础窗口的进阶属性布局管理器入门——解决新手最头疼的“控件位置混乱、窗口缩放后控件错位”问题,全程代码完整可直接运行,新手也能轻松跟上!
mjqx9i5t.png

一、先回顾: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_())

mjqxa0yu.png

代码关键解析

  1. 类的封装:我们把窗口逻辑封装到MyWindow类中(继承QWidget),这是PyQt5开发的标准写法,便于后续拓展功能;
  2. 窗口图标setWindowIcon(QIcon("图标路径")),新手注意路径要正确(代码和图标同目录可直接写文件名);
  3. 固定大小setFixedSize() 适合不需要缩放的工具窗口,取消注释即可生效;
  4. 窗口置顶Qt.WindowStaysOnTopHint 是Qt的内置常量,实现窗口始终在最上层;
  5. 关闭事件:重写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_())

代码关键解析

  1. 布局使用三步法

    • 创建布局实例(QVBoxLayout()/QHBoxLayout());
    • addWidget()向布局中添加控件;
    • setLayout()将布局绑定到窗口;
  2. 间距/边距设置

    • setSpacing():控件之间的间距(单位:像素);
    • setContentsMargins(左, 上, 右, 下):布局和窗口边缘的距离;
  3. 自适应效果:运行后拖动窗口边缘缩放,控件会自动调整位置,不会错位。

对比:手动布局 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_())

运行效果:一个置顶的窗口,内部有大号标题标签和两个按钮,垂直排列且间距均匀,窗口缩放时控件自动适配。
mjqxbt56.png

五、常见问题排查

  1. 布局不生效:忘记调用setLayout(),或布局添加控件后未绑定到窗口;
  2. 图标不显示:图标路径错误(建议将图标放在代码同目录,直接写文件名);
  3. 窗口无法置顶:部分系统(如macOS)对窗口置顶有权限限制,属正常现象;
  4. 控件重叠:未使用布局,手动设置的控件坐标重复,优先用布局管理器解决。

总结

  1. QWidget是PyQt5所有控件的基类,掌握setWindowIcon()/setFixedSize()等属性可自定义窗口样式;
  2. 布局管理器(QVBoxLayout/QHBoxLayout)是解决控件排列的核心,无需手动设置坐标,支持自适应;
  3. PyQt5开发建议封装成类,便于后续拓展功能(如监听事件、添加更多控件)。

下一篇我们会深入讲解PyQt5常用基础控件(标签、按钮、输入框)和信号与槽的核心逻辑,记得关注哦~如果有任何问题,评论区留言讨论!

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消
SSL