PyQt5 笔记(02):嵌套布局

如前一篇笔记,我们还是只讨论两层嵌套布局的情况。

前面的布局有一个缺点:有三个内层布局,则需要三个空部件。那若有十个内层布局呢?显然会让人不舒服。

刚才在玩 Qt Designer 时,发现了一个更好的办法,不管有多少个内层布局,只需要一个空部件

 

一、过程分析:

1. 先准备一个全局部件,用于"承载"全局布局

        # 全局部件(注意参数 self),用于"承载"全局布局
        wwg = QWidget(self)

 

2. 再定义全局布局

       wl = QVBoxLayout(wwg) # 全局布局(注意参数 wwg)

 

3. 定义三个局部布局

        vl = QVBoxLayout() # 三个局部布局
        hl = QHBoxLayout()
        gl = QGridLayout()

 

4. 当然,局部布局内肯定打算放置一些部件

        pass # 这里向局部布局内添加部件

 

5. 把三个局部布局加到全局布局

        wl.addLayout(vl) # 加到全局布局
        wl.addLayout(gl)
        wl.addLayout(hl)

 

二、全部代码

from PyQt5.QtWidgets import *

class MyWindow(QWidget):  

    def __init__(self):
        super().__init__()
        self.setWindowTitle('PyQt5布局示例')
        self.resize(400, 300)

        # 全局部件(注意参数 self),用于"承载"全局布局
        wwg = QWidget(self)

        wl = QVBoxLayout(wwg) # 全局布局(注意参数 wwg)

        vl = QVBoxLayout() # 三个局部布局
        hl = QHBoxLayout()
        gl = QGridLayout()

        pass # 这里向局部布局内添加部件

        wl.addLayout(vl) # 加到全局布局
        wl.addLayout(gl)
        wl.addLayout(hl)

if __name__=="__main__":
    import sys    

    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())   

 

补充:

照上面的思路,更进一步,可以不要多余的空部件:

from PyQt5.QtWidgets import *

class MyWindow(QWidget):  

    def __init__(self):

        super().__init__()
        self.setWindowTitle('PyQt5布局示例')
        self.resize(400, 300)

        # 全局布局(注意参数 self)
        wl = QVBoxLayout(self) 

        # 局部布局
        vl = QVBoxLayout()
        hl = QHBoxLayout()
        gl = QGridLayout()

        # 这里向局部布局内添加部件
        hl.addWidget(QPushButton('1'))
        hl.addWidget(QPushButton('2'))
        vl.addWidget(QPushButton('3'))
        vl.addWidget(QPushButton('4'))
        vl.addWidget(QPushButton('5'))
        gl.addWidget(QPushButton('6'),0,0)
        gl.addWidget(QPushButton('7'),0,1)
        gl.addWidget(QPushButton('8'),1,0)
        gl.addWidget(QPushButton('9'),1,1)

        # 加到全局布局
        wl.addLayout(hl)
        wl.addLayout(vl)
        wl.addLayout(gl)

if __name__=="__main__":
    import sys

    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

 

再补充:

addLayout()方法原型:

  addLayout(QLayout, row, col, row_cross, col_cross, Qt.Alignment)

addWidget()方法原型:

  addWidget(QWidget, row, col, row_cross, col_cross, Qt.Alignment)

时间: 2024-10-28 08:46:50

PyQt5 笔记(02):嵌套布局的相关文章

PyQt5 笔记(01):嵌套布局

  PyQt5 有四种布局:水平(QHBoxLayout).竖直(QVBoxLayout).网格(QGridLayout).表单(QFormLayout)在窗体中单一的布局应该不难,但若是比较复杂的布局,一般涉及到布局的嵌套,这就头疼了. 本文的四个知识点:1. 布局不能直接嵌套(如果我错了,欢迎指正!)2. 内层的布局必须先"附着"在一个空 QWidget 上3. 然后把这个"承载"着内层布局的空部件添加至外层布局4. 最后,别忘记把全局布局"附着&qu

android 嵌套布局出现width问题 不知n道什么原因

问题描述 android 嵌套布局出现width问题 不知n道什么原因 Attribute "android:layout_width" was already specified for element "RelativeLayout". 解决方案 同一个RelativeLayout中定义了2遍android:layout_width 解决方案二: 我也是醉了-------- 解决方案三: 感觉提示不是很明显嘛,你好好看看,还不是多写了 解决方案四: 你写了两遍a

extjs2.02 table布局下无法动态添加控件

问题描述 extjs2.02 table布局下无法动态添加控件 Ext.onReady(function() { var form = new Ext.form.FormPanel({ id: "testForm", renderTo: "windowDiv", width: "700", autoHeight: true, layout: "table", layoutConfig: { columns: 2 }, bord

【Andorid X 项目笔记】嵌套Fragment的使用(5)

前言  之前的文章有介绍ActivityGroup,不少人问嵌套使用的问题,同样的需求在Fragment中也存在,幸好在最新的Android support 包已经支持这一特性!这里就跳过Fragment的介绍,需要注意的是TabActivity已经被标记为弃用(deprecated).   声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://www.cnblogs.com/over140/    正文 一.准备 关于最新的A

Android App中的多个LinearLayout嵌套布局实例解析_Android

在做android  UI布局时,用了LinearLayout嵌套,发现效果并不如我预料一般 查了下资料,说是要设置layout_weight属性 资料说得不是很清楚,也没仔细看,就去弄,结果越弄越混乱. 于是静下心来,自己写xml测试,发现如下. 如果LinearLayout是最外面的一层,它是不会弹出layout_weight属性的, 换句话说最外层不能用layout_weight xml布局如下 <LinearLayout xmlns:android="http://schemas.

PyQt5 笔记(03):弹出窗口大全

本文实现了PyQt5个各种弹出窗口:输入框.消息框.文件对话框.颜色对话框.字体对话框.自定义对话框 其中,为了实现自定义对话框的返回值,使用了信号/槽   本文基于 windows 7 + python 3.4   效果图:     取得弹出窗口的返回值     全部代码:   from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt, pyqtSignal, QTimer class MyWindow(QWidget): def __

ExtJs学习笔记(17)_table布局

table布局顾名思义,就是象table表格一样的布局 <script type="text/javascript"> Ext.onReady(function() { var win = new Ext.Window({ title: "table Layout", height: 210, width: 290, plain: true, bodyStyle: 'padding:15px', layout: 'table', layoutConfig

ExtJs学习笔记(16)_Form布局

这是最重要的一个布局,几乎所有的表单界面都可以采用form布局,详细的用法本文不作讨论(可以查阅官方API文档),这里只给出一个简单的示例 <script type="text/javascript"> Ext.onReady(function() { var win = new Ext.Window({ title: "form Layout", height: 150, width: 230, plain: true, bodyStyle: 'pad

ExtJs学习笔记(15)_fit布局

fit布局很好理解,容器内的组件会自动充满整个容器 <script type="text/javascript"> Ext.onReady(function() { var win = new Ext.Window({ title: "fit Layout", height: 200, width: 200, plain: true, layout: 'fit', items: { html:"这就是内容区,会自动充满容器,要注意的事,通常fi