前言
最近打算使用图形界面开发一个小工具,目的是为了创建一款方便团队内部成员使用的手机操作小工具。此工具将支持诸如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())
这段代码还是比较简单的,大概分三步:
- 创建窗口:继承 QWidget 创建主窗口。
- 设置几何属性:使用 setGeometry 定义窗口的位置和大小。
- 添加控件:通过 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部:
- 创建窗口:继承 QWidget 并设置窗口标题。
- 创建布局:实例化 QHBoxLayout。
- 添加控件:使用 addWidget 方法将控件添加到布局中。
- 设置布局:调用 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的知识点呢,咱们下次再来详细探讨哦!