Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PyQt5 布局管理(水平、垂直、网格、表单、嵌套、QSplitter)

PyQt5 布局管理(水平、垂直、网格、表单、嵌套、QSplitter)

作者头像
Michael阿明
发布于 2022-06-06 01:24:26
发布于 2022-06-06 01:24:26
4.8K03
代码可运行
举报
运行总次数:3
代码可运行

文章目录

learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5

1. 布局管理

  • QHBoxLayout 水平
  • QVBoxLayout 垂直
  • QGridLayout 网格
  • QFormLayout 表单布局,两列的形式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
addLayout() 插入子布局
addWidget() 在布局中插入控件

2. 使用绝对位置布局

  • 使用 (x, y) 坐标
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        lbl1 = QLabel('欢迎', self)
        # lbl1.move(15, 10)

        lbl2 = QLabel('学习', self)
        lbl2.move(35, 40)

        lbl3 = QLabel('PyQt5 !', self)
        lbl3.move(55, 70)

        self.setGeometry(300, 300, 320, 120)
        self.setWindowTitle('绝对位置布局例子')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Example()
    demo.show()
    sys.exit(app.exec_())
  • 缺点: 窗口大小变动时,控件大小和位置不会随动

3. QBoxLayout

  • stretch 参数设置伸缩量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# _*_ coding: utf-8 _*_
# @Time : 2022/6/4 18:49
# @Author : Michael
# @File : hbox.py
# @desc :

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QPushButton, QApplication


class Winform(QWidget):
    def __init__(self):
        super(Winform, self).__init__()
        self.setWindowTitle('HBox')

        layout = QHBoxLayout()
        layout.addWidget(QPushButton('1'), 2, Qt.AlignTop)
        layout.addWidget(QPushButton('2'), 0, Qt.AlignBottom | Qt.AlignRight)
        layout.addWidget(QPushButton('3'))
        layout.addWidget(QPushButton('4'), 3, Qt.AlignTop | Qt.AlignJustify) # 伸缩量3, 居中,两边对齐
        layout.addWidget(QPushButton('5'))
        layout.setSpacing(5) # 控件间距 5

        self.setLayout(layout)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = Winform()
    win.show()
    sys.exit(app.exec_())
addStretch() 添加可伸缩控件
  • 添加到布局末尾
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton
import sys

class WindowDemo(QWidget):
    def __init__(self):
        super().__init__()

        btn1 = QPushButton(self)
        btn2 = QPushButton(self)
        btn3 = QPushButton(self)
        btn1.setText('button 1')
        btn2.setText('button 2')
        btn3.setText('button 3')

        layout = QHBoxLayout()
        # 设置伸缩量为2
        layout.addStretch(2)
        layout.addWidget(btn1)
        # 设置伸缩量为1
        layout.addStretch(1)
        layout.addWidget(btn2)
        # 设置伸缩量为1
        layout.addStretch(1)
        layout.addWidget(btn3)
        # 设置伸缩量为1
        layout.addStretch(1)
        # 剩余空间比例 2:1:1:1
        self.setLayout(layout)
        self.setWindowTitle("addStretch 例子")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = WindowDemo()
    win.show()
    sys.exit(app.exec_())

若只给最前面添加一个,则为右对齐 若只给最后面添加一个,则为左对齐

4. QGridLayout

  • 控件占一格的例子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton


class Winform(QWidget):
    def __init__(self, parent=None):
        super(Winform, self).__init__(parent)
        self.initUI()

    def initUI(self):
        # 1
        grid = QGridLayout()
        self.setLayout(grid)

        # 2
        names = ['Cls', 'Back', '', 'Close',
                 '7', '8', '9', '/',
                 '4', '5', '6', '*',
                 '1', '2', '3', '-',
                 '0', '.', '=', '+']

        # 3
        positions = [(i, j) for i in range(5) for j in range(4)]
        print(positions)

        # 4
        for position, name in zip(positions, names):
            if name == '':
                continue

            button = QPushButton(name)
            grid.addWidget(button, *position)

        self.move(300, 150)
        self.setWindowTitle('网格布局管理例子')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Winform()
    form.show()
    sys.exit(app.exec_())
  • 控件跨越多格
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication


class Winform(QWidget):
    def __init__(self, parent=None):
        super(Winform, self).__init__(parent)
        self.initUI()

    def initUI(self):
        titleLabel = QLabel('标题')
        authorLabel = QLabel('提交人')
        contentLabel = QLabel('申告内容')

        titleEdit = QLineEdit()
        authorEdit = QLineEdit()
        contentEdit = QTextEdit()

        grid = QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(titleLabel, 1, 0) # row 1, column 0
        grid.addWidget(titleEdit, 1, 1) # row 1, column 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.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('故障申告')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Winform()
    form.show()
    sys.exit(app.exec_())

5. QFormLayout

  • 两列,一般左侧是 label,右侧是用户选择或者输入 field
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLineEdit, QLabel


class Winform(QWidget):
    def __init__(self, parent=None):
        super(Winform, self).__init__(parent)
        self.setWindowTitle("窗体布局管理例子")
        self.resize(400, 100)

        fromlayout = QFormLayout()
        labl1 = QLabel("姓名")
        lineEdit1 = QLineEdit()
        labl2 = QLabel("年龄")
        lineEdit2 = QLineEdit()
        labl3 = QLabel("性别")
        lineEdit3 = QLineEdit()

        fromlayout.addRow(labl1, lineEdit1)
        fromlayout.addRow(labl2, lineEdit2)
        fromlayout.addRow(labl3, lineEdit3)

        self.setLayout(fromlayout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Winform()
    form.show()
    sys.exit(app.exec_())

6. 嵌套布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout, QPushButton

class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('嵌套布局示例')

        # 全局布局(1个):水平
        wlayout = QHBoxLayout()
        # 局部布局(4个):水平、竖直、网格、表单
        hlayout = QHBoxLayout()
        vlayout = QVBoxLayout()
        glayout = QGridLayout()
        formlayout = QFormLayout()

        # 局部布局添加部件(例如:按钮)
        hlayout.addWidget(QPushButton(str(1)))
        hlayout.addWidget(QPushButton(str(2)))
        vlayout.addWidget(QPushButton(str(3)))
        vlayout.addWidget(QPushButton(str(4)))
        glayout.addWidget(QPushButton(str(5)), 0, 0)
        glayout.addWidget(QPushButton(str(6)), 0, 1)
        glayout.addWidget(QPushButton(str(7)), 1, 0)
        glayout.addWidget(QPushButton(str(8)), 1, 1)
        formlayout.addWidget(QPushButton(str(9)))
        formlayout.addWidget(QPushButton(str(10)))
        formlayout.addWidget(QPushButton(str(11)))
        formlayout.addWidget(QPushButton(str(12)))

        # 准备四个部件
        hwg = QWidget()
        vwg = QWidget()
        gwg = QWidget()
        fwg = QWidget()

        # 四个部件设置局部布局
        hwg.setLayout(hlayout)
        vwg.setLayout(vlayout)
        gwg.setLayout(glayout)
        fwg.setLayout(formlayout)

        # 四个部件加至全局布局
        wlayout.addWidget(hwg)
        wlayout.addWidget(vwg)
        wlayout.addWidget(gwg)
        wlayout.addWidget(fwg)

        # 窗体本体设置全局布局
        self.setLayout(wlayout)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

上面使用了多个空白控件来设置局部布局

下面只使用一个空白控件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# _*_ coding: utf-8 _*_
# @Time : 2022/6/5 17:11
# @Author : Michael
# @File : nest_layout1.py
# @desc :
import sys

from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout, QGridLayout, QFormLayout, QPushButton, QLineEdit, \
    QApplication


class mywin(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('nest_layout1')
        self.resize(500, 300)

        # 全局部件, 注意 self 参数
        globalwidget = QWidget(self)

        # 全局布局
        globallayout = QHBoxLayout(globalwidget)

        # 局部布局
        h_layout = QHBoxLayout()
        v_layout = QVBoxLayout()
        g_layout = QGridLayout()
        form_layout = QFormLayout()

        # 局部布局 添加控件
        h_layout.addWidget(QPushButton(str(1)))
        h_layout.addWidget(QPushButton(str(2)))
        v_layout.addWidget(QPushButton(str(3)))
        v_layout.addWidget(QPushButton(str(4)))
        g_layout.addWidget(QPushButton(str(5)), 0, 0)
        g_layout.addWidget(QPushButton(str(6)), 0, 1)
        g_layout.addWidget(QPushButton(str(7)), 1, 0)
        g_layout.addWidget(QPushButton(str(8)), 1, 1)
        g_layout.addWidget(QPushButton(str(9)), 2, 0)
        g_layout.addWidget(QPushButton(str(10)), 2, 1)
        form_layout.addRow('name', QLineEdit())
        form_layout.addRow('age', QLineEdit())

        # 局部布局 添加到 全局布局
        globallayout.addLayout(h_layout)
        globallayout.addLayout(v_layout)
        globallayout.addLayout(g_layout)
        globallayout.addLayout(form_layout)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = mywin()
    win.show()
    sys.exit(app.exec_())

7. QSplitter 布局

  • 可以动态拖动子控件之间的边界,默认是横向布局
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# _*_ coding: utf-8 _*_
# @Time : 2022/6/5 17:31
# @Author : Michael
# @File : qsplitter.py
# @desc :
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QFrame, QSplitter, QTextEdit, QApplication


class qsplitter_demo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle('QSplitter')

        h_layout = QHBoxLayout(self)

        topleft = QFrame()
        topleft.setFrameShape(QFrame.StyledPanel)
        textedit = QTextEdit()

        spliter1 = QSplitter(Qt.Horizontal)
        spliter1.addWidget(topleft)
        spliter1.addWidget(textedit)
        spliter1.setSizes([100, 200])

        bottom = QFrame()
        bottom.setFrameShape(QFrame.StyledPanel)

        spliter2 = QSplitter(Qt.Vertical)
        spliter2.addWidget(spliter1)
        spliter2.addWidget(bottom)

        h_layout.addWidget(spliter2)
        self.setLayout(h_layout)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    qsplitter_demo = qsplitter_demo()
    qsplitter_demo.show()
    sys.exit(app.exec_())
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
在 PyQt5 中,菜单栏(QMenuBar)、工具栏(QToolBar)和状态栏(QStatusBar)是 QMainWindow 提供的标准控件,用于帮助用户更好地与应用程序交互。它们是桌面应用程序的常见组成部分:
半截诗
2024/10/09
2.6K0
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
Python Qt GUI设计:窗口布局管理方法【强化篇】(基础篇—6)
在Python Qt GUI设计:窗口布局管理方法【基础篇】(基础篇—5)文章中,聊到了如何使用Qt Designer进行窗口布局管理,其实在Qt Designer中可以非常方便进行窗口布局管理设计,本篇博文在4种窗口布局方式基础上继续深入聊聊API函数~
不脱发的程序猿
2021/10/09
4.7K0
Python Qt GUI设计:窗口布局管理方法【强化篇】(基础篇—6)
PyQt5案例汇总(完整版)
PyQt5是一套绑定Qt5的应用程序框架。他在Python 2.x和3.x中都是可用的。该教程使用的是Python3.x。
victorfengming
2021/11/26
5.3K0
PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)
learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5
Michael阿明
2022/05/10
2K0
PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
PyQt5 是 Python 的图形用户界面 (GUI) 框架,它基于强大的 Qt 库。Qt 是一个跨平台的 C++ 框架,用于构建桌面应用程序。通过 PyQt5,我们可以用 Python 轻松构建跨平台的桌面应用程序,支持 Windows、macOS 和 Linux。
半截诗
2024/10/09
20.7K0
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
Python GUI教程三:布局
摘要:这篇文章是Python GUI教程系列的第三篇,将介绍Qt编程中的布局概念及其在Python环境下的实现
py3study
2020/01/08
1.2K0
python pyqt5 嵌套布局
import sys from PyQt5.QtWidgets import QApplication ,QWidget , QHBoxLayout, QVBoxLayout, QGridLayout , QFormLayout, QPushButton
用户5760343
2019/07/22
9570
Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
在开发程序时,如果这个程序只有一个窗口,则应该关心这个窗口里面的各个控件之间是如何传递数据的。如果这个程序有多个窗口,那么还应该关心不同的窗口之间是如何传递数据的。
不脱发的程序猿
2021/12/08
3.3K0
Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
PyQt5 基本窗口控件(状态栏/窗口/图标/提示消息/QLabel/文本类控件)
文章目录 1. 状态栏 2. 窗口居中显示 3. 关闭窗口 4. QWidget 5. 添加图标 6. 气泡提示信息 7. QLabel 添加快捷键 8. QLineEdit echoMode 验证器 inputMask 综合练习 9. QTextEdit learn from 《PyQt5 快速开发与实战》 1. 状态栏 self.statusbar.showMessage("hello, Michael", 2000),第二个参数是显示多长时间ms,默认无限长时间 # -*- coding: utf-8
Michael阿明
2022/05/10
2.6K0
PyQt5 基本窗口控件(状态栏/窗口/图标/提示消息/QLabel/文本类控件)
PyQt5布局管理之QVBoxLayout(二)[通俗易懂]
采用QVBoxLayout类,按照从上到下的顺序添加控件 本节内容较少,演示两个实例,便于明白QVBoxLayout(垂直布局)的使用
全栈程序员站长
2022/07/04
2.7K0
PyQt5布局管理之QVBoxLayout(二)[通俗易懂]
用 PyQt 打造具有专业外观的 GUI
如果您一直在创建表单以执行将数据输入数据库等操作,那么QFormLayout适合您。此类将小部件布置为两列布局。第一列通常显示描述预期输入的标签,第二列通常包含允许用户输入或编辑数据的输入小部件,例如QLineEdit,QComboBox或QSpinBox。
sergiojune
2021/07/19
2.9K0
用 PyQt 打造具有专业外观的 GUI
Python高级进阶#009 pyqt5中窗体的绝对布局和相对布局
Desktop()函数,这个函数是在Qapplication类中的。函数返回的结果QDesktopWidget对象。
刘金玉编程
2019/10/18
2.4K0
PyQt5--GridLayoutMul
1 # -*- coding:utf-8 -*- 2 ''' 3 Created on Sep 13, 2018 4 5 @author: SaShuangYiBing 6 ''' 7 import sys 8 from PyQt5.QtWidgets import QApplication,QWidget,QGridLayout,QLabel,QLineEdit,QTextEdit 9 10 class New_test(QWidget): 11 def __init__(s
py3study
2020/01/19
2960
PyQt5--GridLayoutMul
Python高级进阶#010 pyqt5网格布局QGridLayout
我们其实可以通过网格布局实例化后的对象,直接通过代码提示的方式看到很多我们可以直接实现的方法。
刘金玉编程
2019/10/23
2.3K0
Python高级进阶#010 pyqt5网格布局QGridLayout
python pyqt5 QGridLayout网格布局
import sys from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
用户5760343
2019/07/22
1.4K0
一篇文章让你读懂PyQt5布局管理,绝对干货
PyQt5的界面布局主要有两种方法:绝对定位和局部类。在PyQt5中有四种布局方式:水平布局、垂直布局、网格布局、表单布局。还有两种布局方法:addLayout和addWidget,其中addLayout用于在布局中插入子布局,addWidget用于在布局中插入控件。
星星在线
2019/05/28
20.9K0
python pyqt5 QHBoxLayout 水平布局
import sys from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton
用户5760343
2019/07/23
1.3K0
python pyqt5 设置控件随窗体拉伸
from PyQt5.QtWidgets import QApplication ,QWidget, QVBoxLayout , QHBoxLayout ,QPushButton import sys
用户5760343
2019/07/22
4.3K0
PyQt中布局管理
布局管理是GUI编程中的一个重要方面。布局管理是一种如何在应用窗口上放置组件的一种方法。我们可以通过两种基础方式来管理布局。我们可以使用绝对定位和布局类。使用布局管理器管理布局是组织窗口小部件的首选方式
小飞侠xp
2018/12/24
1.8K0
[PyQt Tutorial]6.Layout Management(布局管理)
https://www.tutorialspoint.com/pyqt/pyqt_introduction.htm
bsbforever
2020/08/19
7630
[PyQt Tutorial]6.Layout Management(布局管理)
推荐阅读
相关推荐
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验