十四、PyQt5 之 布局
# !/usr/bin/python # -*- coding:utf-8 -*- """ 绝对布局, 自己手动move到屏幕到指定位置 """ import sys, math from PyQt5.QtWidgets import * class AbsoluteLayout(QWidget): def __init__(self): super(AbsoluteLayout, self).__init__() self.setWindowTitle("绝对布局") self.label1 = QLabel("王勇", self) self.label1.move(15, 20) self.label2 = QLabel("WY", self) self.label2.move(35, 40) self.label3 = QLabel("WYY", self) self.label3.move(55, 80) if __name__ == '__main__': app = QApplication(sys.argv) main = AbsoluteLayout() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 水平盒布局 (QHBoxLayout) """ import sys from PyQt5.QtWidgets import * class HBoxLayout(QWidget): def __init__(self): super(HBoxLayout, self).__init__() self.setWindowTitle("水平盒布局") hlayout = QHBoxLayout() hlayout.addWidget(QPushButton('按钮1')) hlayout.addWidget(QPushButton('按钮2')) hlayout.addWidget(QPushButton('按钮3')) hlayout.addWidget(QPushButton('按钮4')) hlayout.addWidget(QPushButton('按钮5')) # 设置控件之间的间距 hlayout.setSpacing(40) self.setLayout(hlayout) if __name__ == '__main__': app = QApplication(sys.argv) main = HBoxLayout() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 设置控件的对齐方式 (左对齐,右对齐,顶端对齐,底端对齐) """ import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt class HBoxLayoutAlign(QWidget): def __init__(self): super(HBoxLayoutAlign, self).__init__() self.setWindowTitle("水平盒布局") hlayout = QHBoxLayout() # addWidget(控件,占水平的比例(伸缩量), 对齐方式 ) hlayout.addWidget(QPushButton('按钮1'), 1, Qt.AlignLeft | Qt.AlignTop) # 左侧顶端 hlayout.addWidget(QPushButton('按钮2'), 1, Qt.AlignLeft | Qt.AlignTop) hlayout.addWidget(QPushButton('按钮3'), 2, Qt.AlignLeft | Qt.AlignTop) hlayout.addWidget(QPushButton('按钮4'), 1, Qt.AlignLeft | Qt.AlignBottom) # 左侧底端 hlayout.addWidget(QPushButton('按钮5'), 1, Qt.AlignLeft | Qt.AlignBottom) # 左侧底端 # 设置控件之间的间距 hlayout.setSpacing(40) self.setLayout(hlayout) if __name__ == '__main__': app = QApplication(sys.argv) main = HBoxLayoutAlign() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 垂直盒布局(QBoxLayout) """ import sys from PyQt5.QtWidgets import * class VBoxLayout(QWidget): def __init__(self): super(VBoxLayout, self).__init__() self.setWindowTitle("垂直盒布局") layout = QVBoxLayout() layout.addWidget(QPushButton('按钮1')) layout.addWidget(QPushButton('按钮2')) layout.addWidget(QPushButton('按钮3')) layout.addWidget(QPushButton('按钮4')) layout.addWidget(QPushButton('按钮5')) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) main = VBoxLayout() main.show() sys.exit(app.exec_())
五、设置布局的伸缩量(addStretch)
5.1 常规设置
# !/usr/bin/python # -*- coding:utf-8 -*- """ 设置伸缩量(addStretch) """ import sys from PyQt5.QtWidgets import * class Stretch(QWidget): def __init__(self): super(Stretch, self).__init__() self.setWindowTitle("设置伸缩量") btn1 = QPushButton(self) btn2 = QPushButton(self) btn3 = QPushButton(self) btn1.setText("按钮1") btn2.setText("按钮2") btn3.setText("按钮3") layout = QHBoxLayout() # 伸缩量设置在布局上,当紧跟着的是添加控件的代码,就会作用于当前添加的控件, 默认控件是右对齐的 layout.addStretch(1) layout.addWidget(btn1) layout.addStretch(2) layout.addWidget(btn2) layout.addStretch(3) layout.addWidget(btn3) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) main = Stretch() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 设置伸缩量(addStretch) 伸缩量为 0 """ import sys from PyQt5.QtWidgets import * class Stretch(QWidget): def __init__(self): super(Stretch, self).__init__() self.setWindowTitle("设置伸缩量") self.resize(800, 100) btn1 = QPushButton(self) btn2 = QPushButton(self) btn3 = QPushButton(self) btn4 = QPushButton(self) btn5 = QPushButton(self) btn1.setText("按钮1") btn2.setText("按钮2") btn3.setText("按钮3") btn4.setText("按钮4") btn5.setText("按钮5") layout = QHBoxLayout() # 伸缩量为 0, 会让下面设置的控件全部居左排满,然后可以将剩下的控件设置成1, 这样剩下的控件可以全局居右 layout.addStretch(0) layout.addWidget(btn1) layout.addWidget(btn2) layout.addWidget(btn3) layout.addWidget(btn4) layout.addWidget(btn5) btnOK = QPushButton(self) btnOK.setText("确定") btnCancel = QPushButton(self) btnCancel.setText("取消") layout.addStretch(1) layout.addWidget(btnOK) layout.addWidget(btnCancel) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) main = Stretch() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 让按钮永远在窗口右下角 """ import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt class RightBottomButton(QWidget): def __init__(self): super(RightBottomButton, self).__init__() self.setWindowTitle("让按钮永远在右下角") self.resize(400, 300) okButton = QPushButton("确定") cancelButton = QPushButton("取消") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) vbox = QVBoxLayout() btn1 = QPushButton("按钮1") btn2 = QPushButton("按钮2") btn3 = QPushButton("按钮3") vbox.addStretch(0) vbox.addWidget(btn1) vbox.addWidget(btn2) vbox.addWidget(btn3) vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) if __name__ == '__main__': app = QApplication(sys.argv) main = RightBottomButton() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 栅格布局:实现计算器UI """ import sys from PyQt5.QtWidgets import * class Calc(QWidget): def __init__(self): super(Calc, self).__init__() self.setWindowTitle("栅格布局") grid = QGridLayout() self.setLayout(grid) names = ['Cls', 'Back', '', 'Close', '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+'] # 创建五行四列的坐标 positions = [(i, j) for i in range(5) for j in range(4)] print(positions) # 将names 和位置合并到一起,创建一个可迭代对象,zip可以包含多个可迭代对象,并将每个可迭代对象的元素重新组合到一起 # zip(1,2) 将参数1,2 组合成一个元素。 相当于 将 Cls 对应 (0, 0); Back 对应 (0, 1) for position, name in zip(positions, names): if name == '': # 空的直接跳过 continue button = QPushButton(name) # print(position) grid.addWidget(button, *position) if __name__ == '__main__': app = QApplication(sys.argv) main = Calc() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 栅格布局 (QGridLayout) """ import sys from PyQt5.QtWidgets import * class GridForm(QWidget): def __init__(self): super(GridForm, self).__init__() self.setWindowTitle("栅格布局:表单设计") titleLabel = QLabel('标题') authorLabel = QLabel('作者') contentLabel = QLabel('内容') titleEdit = QLineEdit() authorEdit = QLineEdit() contentEdit = QTextEdit() grid = QGridLayout() grid.setSpacing(10) grid.addWidget(titleLabel, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(authorLabel, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(contentLabel, 3, 0) grid.addWidget(contentEdit, 3, 1, 5, 1) self.setLayout(grid) self.resize(350, 300) if __name__ == '__main__': app = QApplication(sys.argv) main = GridForm() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 表单布局(QFormLayout) """ import sys from PyQt5.QtWidgets import * class FormForm(QWidget): def __init__(self): super(FormForm, self).__init__() self.setWindowTitle("表单布局") self.resize(350, 300) formLayout = QFormLayout() titleLabel = QLabel('标题') authorLabel = QLabel('作者') contentLabel = QLabel('内容') titleEdit = QLineEdit() authorEdit = QLineEdit() contentEdit = QTextEdit() formLayout.addRow(titleLabel, titleEdit) formLayout.addRow(authorLabel, authorEdit) formLayout.addRow(contentLabel, contentEdit) self.setLayout(formLayout) if __name__ == '__main__': app = QApplication(sys.argv) main = FormForm() main.show() sys.exit(app.exec_())
# !/usr/bin/python # -*- coding:utf-8 -*- """ 拖动控件之间的边界(QSplitter) """ import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class Splitter(QWidget): def __init__(self): super(Splitter, self).__init__() self.initUI() def initUI(self): hbox = QHBoxLayout(self) self.setWindowTitle('QSplitter 例子') self.setGeometry(300, 300, 300, 200) # 创建左右拖动的, QFrame 是一个容器 topleft = QFrame() topleft.setFrameShape(QFrame.StyledPanel) bottom = QFrame() bottom.setFrameShape(QFrame.StyledPanel) textedit = QTextEdit() # 创建一个左右拖动的对象 splitter1 = QSplitter(Qt.Horizontal) splitter1.addWidget(topleft) splitter1.addWidget(textedit) splitter1.setSizes([200, 100]) # 创建一个上下拖动的对象 splitter2 = QSplitter(Qt.Vertical) splitter2.addWidget(splitter1) splitter2.addWidget(bottom) hbox.addWidget(splitter2) self.setLayout(hbox) if __name__ == '__main__': app = QApplication(sys.argv) demo = Splitter() demo.show() sys.exit(app.exec_())