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的知识点呢,咱们下次再来详细探讨哦!

相关推荐
YOLO数据集工作室4 分钟前
Python人工智能学习路线
人工智能·python·学习
Flying_Fish_roe6 分钟前
springboot集成MyBatis-Plus
spring boot·后端·mybatis
橙子小哥的代码世界27 分钟前
深度学习02-pytorch-02-张量的拼接操作
人工智能·pytorch·python
yunson_Liu32 分钟前
编写Python脚本在证书过期10天内将域名信息发送到钉钉
开发语言·python·钉钉
waterHBO1 小时前
python mysql pymysql 数据库操作,常用脚本,个人小工具
数据库·python·mysql
JAMES费1 小时前
python机器人编程——用手机web远程视频监控并控制小车驾驶(上篇vrep仿真)
python·智能手机·机器人
void10241 小时前
python画图1
开发语言·python
程序员甲鱼2 小时前
Linkding:让你的书签井井有条
后端
点灯的人3 小时前
Camunda源码发布流程
后端
程序员大金3 小时前
基于SpringBoot+Vue+MySQL的特色旅游网站系统
java·前端·vue.js·spring boot·后端·mysql·tomcat