十四、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_())

二、水平盒布局(QHBoxLayout)

# !/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_())

四、垂直盒布局(QVBoxLayout)

# !/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_())

5.2 特殊场景

# !/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_())

七、使用栅格布局:实现计算器UI

# !/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_())

八、栅格布局(QGridLayout)

# !/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_())

十、拖动控件之间的边界(QSplitter)

# !/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_())

 

posted on 2022-07-09 11:33  软饭攻城狮  阅读(132)  评论(0编辑  收藏  举报

导航