Appearance
布局
主要有四类
- QBoxLayout
- QGridLayout
- QFromLayout
- QStackedLayout
QBoxLayout
盒子布局
一般使用的是他的两个子类QVBoxLayout(vertical垂直) QHBoxLayout(horizontal水平), 负责垂直以及水平布局
python
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
import sys
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(200, 300)
self.setWindowTitle("hello world")
# 获取一个垂直布局器
layout = QVBoxLayout()
btn1 = QPushButton('按钮1')
layout.addWidget(btn1)
btn2 = QPushButton('按钮2')
layout.addWidget(btn2)
btn3 = QPushButton('按钮3')
layout.addWidget(btn3)
# Strectch 伸展张开, 不加这个的话这三个按键平均分布
# 可以把这一个想象为一个弹簧, 这一个弹簧在最下面
# 这一个参数是比例关系
layout.addStretch(2)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
app.exec()
python
from PyQt5.QtWidgets import *
import sys
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
container = QVBoxLayout()
# 第一个子框架
hobby_box = QGroupBox("爱好")
v_layout = QVBoxLayout()
btn1 = QRadioButton("抽烟")
btn2 = QRadioButton("喝酒")
btn3 = QRadioButton("打麻将")
v_layout.addWidget(btn1)
v_layout.addWidget(btn2)
v_layout.addWidget(btn3)
# 给他设置一个布局
hobby_box.setLayout(v_layout)
# 另一个框
gender_box = QGroupBox("性别")
h_layout = QHBoxLayout()
btn4 = QRadioButton("男")
btn5 = QRadioButton("女")
h_layout.addWidget(btn4)
h_layout.addWidget(btn5)
gender_box.setLayout(h_layout)
container.addWidget(hobby_box)
container.addWidget(gender_box)
self.setLayout(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
app.exec()
函数
添加组件
python
layout.addWidget(btn3)
添加弹簧
python
# Strectch 伸展张开, 不加这个的话这三个按键平均分布
# 可以把这一个想象为一个弹簧, 这一个弹簧在最下面
# 这一个参数是比例关系
layout.addStretch(2)
QGridLayout
Qt学习之路14--布局管理器(QGridLayout)_qtwidgets.qgridlayout()setspacing(0)-CSDN博客
这一个是九宫格布局, 设置的时候需要给出行号以及列号
python
from PyQt5.QtWidgets import *
import sys
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("计算器")
data = {
0: ["7", "8", "9", "+", "("],
1: ["4", "5", "6", "-", ")"],
2: ["1", "2", "3", "*", "<-"],
3: ["0", ".", "=", "/", "C"]
}
# 总的布局
layout = QVBoxLayout()
# 文本框
edit = QLineEdit()
edit.setPlaceholderText("请输入")
layout.addWidget(edit)
grid = QGridLayout()
for lint_number, line_data in data.items():
for col_number, number in enumerate(line_data):
btn = QPushButton(number)
# 设置按键布局
grid.addWidget(btn, lint_number, col_number)
layout.addLayout(grid)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
app.exec()
QFormLayout
适用于提交数据form表单, 比如登录, 注册之类的场景
QFormLayout是label-field式的表单布局,其目标是提供表单方式的布局,主要由两列构成,第一列一般叫做label域,用于显示提示信息;第二列一般叫做field域,需要用户进行选择,输入,点击等交互操作。
QFormLayout常用方法:
- addRow(): 添加一行,包括标签(label)和域(field)
- insertRow(): 插入一行
- removeRow(): 移除一行
- setItem(): 在指定行,指定角色位置设置一个QLayoutItem项
- setWidget(): 在指定行,指定角色位置设置一个部件
- setLayout: 在指定行,指定角色位置设置一个布局
python
import sys
from PyQt5.QtWidgets import QLabel, QWidget, QApplication, QTextEdit, QLineEdit, QFormLayout
"""
表单布局 QFormLayout
"""
class QFormLayoutDemo(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('表单布局')
self.resize(600, 400)
f_layout = QFormLayout(self)
title_label = QLabel('标题')
author_label = QLabel('作者')
content_label = QLabel('内容')
title_line = QLineEdit()
author_line = QLineEdit()
content_text = QTextEdit()
f_layout.addRow(title_label, title_line) # 添加行
f_layout.addRow(author_label, author_line)
f_layout.addRow(content_label, content_text)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QFormLayoutDemo()
w.show()
app.exec()
QStackedLayout
抽屉布局, 有不同的东西需要显示, 通过选择显示不同的页面, 在同一个位置进行显示