PyQt6 中的布局管理

前言

最近打算使用图形界面开发一个小工具,目的是为了创建一款方便团队内部成员使用的手机操作小工具。此工具将支持诸如UI验收时所需的截图功能,并可在发现崩溃情况时快速抓取崩溃日志。此外,也将包括快速安装、卸载应用程序等实用性颇高的功能,这些操作都将利用adb的常用命令以图形化形式来实现。

当然要实现这个小工具,除了编程基础外,还需要学习GUI工具。

常见的图形界面开发库

笔者了解到的有Tkinter、wxPython、PyGTK、PySide、PyQt,笔者这里选择了PyQt,一个是因为 手头正好有相关学习资料。另一个更重要的原因是被它的优秀特性所吸引。

  • 基于高性能的Qt的GUI控件集。
  • 能够跨平台运行在Windows、Linux和Mac OS等系统上。
  • 使用信号/槽(signal/slot)机制进行通信。
  • 对Qt库的完全封装。
  • 可以使用Qt成熟的IDE(如Qt Designer)进行图形界面设计,并自动生成可执行的Python代码。
  • 提供了一整套种类繁多的窗口控件。

从布局管理开始

笔者觉得布局是一个比较头疼也是比较难的一个知识点,所以从理解布局开始。 对界面进行布局管理主要有两种方法,绝对位置和布局类。

绝对位置

绝对位置,顾名思义就是通过指定每一个控件的显示坐标和大小来实现。最开始的坐标在左上角(0,0)的位置, 以(0,0)为原点定位窗口某一点的具体位置。显示坐标的表示方法是(x,y),x 是横坐标,从左到右变化;y 是纵坐标,从上到下变化。在绝对位置布局中,窗口中的控件采用绝对位置进行布局。

案例:

scss 复制代码
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton

class AbsolutePositionWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("绝对布局示例")
        self.setGeometry(100, 100, 400, 300)

        # 创建控件
        label = QLabel("欢迎使用 PyQt6!", self)
        label.setGeometry(150, 50, 100, 30)  # 设置位置和大小

        button1 = QPushButton("按钮 1", self)
        button1.setGeometry(50, 100, 100, 30)  # 设置位置和大小

        button2 = QPushButton("按钮 2", self)
        button2.setGeometry(250, 100, 100, 30)  # 设置位置和大小

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AbsolutePositionWindow()
    window.show()
    sys.exit(app.exec())

这段代码还是比较简单的,大概分三步:

  1. 创建窗口:继承 QWidget 创建主窗口。
  2. 设置几何属性:使用 setGeometry 定义窗口的位置和大小。
  3. 添加控件:通过 setGeometry 设置每个控件的具体位置和大小。

注意:使用绝对布局时,窗口大小变化可能导致控件重叠或位置不佳。

布局类

PyQt6 提供了几种布局管理器:

  • QHBoxLayout:水平布局管理器,按横向排列控件。
  • QVBoxLayout:垂直布局管理器,按纵向排列控件。
  • QGridLayout:网格布局管理器,可以将控件放置在行和列中。
  • QFormLayout:表单布局管理器,适合用于表单的输入界面。
水平布局管理器QHBoxLayout

先来看个案例:

css 复制代码
import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QLabel


class HBoxLayoutExample(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QHBoxLayout 示例")
        self.resize(800, 200)

        # 创建水平布局
        layout = QHBoxLayout()

        # 创建控件
        label = QLabel("选择一个按钮:")
        button1 = QPushButton("按钮 1")
        button2 = QPushButton("按钮 2")

        # 将控件添加到布局中, 水平居左 垂直居上
        layout.addWidget(label, 0, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
        layout.addWidget(button1, 0, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
        # 水平居右 垂直居下
        layout.addWidget(button2, 0, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom)
        # 设置窗口的布局
        self.setLayout(layout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = HBoxLayoutExample()
    window.show()
    sys.exit(app.exec())

整体代码也是比较简单的,大概分为4部:

  1. 创建窗口:继承 QWidget 并设置窗口标题。
  2. 创建布局:实例化 QHBoxLayout。
  3. 添加控件:使用 addWidget 方法将控件添加到布局中。
  4. 设置布局:调用 setLayout 方法将布局应用到窗口。

下面介绍一下,QHBoxLayout类中的常用方法:

  • addWidget: 在布局中添加控件,alignment用来指定对齐方式
  • addLayout: 在窗口的右边添加布局
  • addSpacing: 设置各控件的上下间距
垂直布局管理器QVBoxLayout

这个就不多说了,上面的案例中,将创建布局:实例化 QHBoxLayout改为实例化QVBoxLayout即可, 其余都一样。

addStretch()

该方法用于在布局中添加可伸缩的空间,帮助在控件之间创建间距,并使得布局更加灵活。使用 addStretch() 可以让某些控件在窗口大小变化时保持一定的比例。

看看案例:

scss 复制代码
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton


class StretchExample(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("addStretch() 示例")

        # 创建水平布局
        layout = QHBoxLayout()

        # 创建控件
        button1 = QPushButton("按钮 1")
        button2 = QPushButton("按钮 2")
        button3 = QPushButton("按钮 3")

        # 添加控件到布局
        layout.addWidget(button1)
        layout.addStretch(1)  # 添加可伸缩空间
        layout.addWidget(button2)
        layout.addStretch(2)  # 添加更大可伸缩空间
        layout.addWidget(button3)

        # 设置窗口的布局
        self.setLayout(layout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = StretchExample()
    window.show()
    sys.exit(app.exec())

这段代码,在按钮 1 和按钮 2 之间添加了一个可伸缩的空间,因子为 1,在按钮 2 和按钮 3 之间添加了一个更大的可伸缩空间,因子为 2。 这样在调整窗口大小时,按钮之间的间距会相应发生变化。通过调整 addStretch() 的因子,可以控制各个控件间的空白比例,从而实现灵活的界面设计。

最后

好啦,大家先停下来稍微消化一下哈~ 关于QGridLayout和QFormLayout的知识点呢,咱们下次再来详细探讨哦!

相关推荐
奔跑吧邓邓子4 分钟前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
码界筑梦坊27 分钟前
基于Flask的京东商品信息可视化分析系统的设计与实现
大数据·python·信息可视化·flask·毕业设计
pianmian128 分钟前
python绘图之箱型图
python·信息可视化·数据分析
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
赔罪2 小时前
Python 高级特性-切片
开发语言·python
Asthenia04122 小时前
浏览器缓存机制深度解析:电商场景下的性能优化实践
后端
伊一大数据&人工智能学习日志3 小时前
selenium爬取苏宁易购平台某产品的评论
爬虫·python·selenium·测试工具·网络爬虫
说是用户昵称已存在3 小时前
Pycharm+CodeGPT+Ollama+Deepseek
ide·python·ai·pycharm
Fansv5873 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
wang_yb4 小时前
『Python底层原理』--Python对象系统探秘
python·databook