PyQt5之布局管理

PyQt5之布局管理

转自:PyQt5之布局管理 - wallace-rice - 博客园
 

PyQt5之布局管理 - wallace-rice - 博客园


一 写在开头

1.1 本文内容

本文内容为PyQt5中的布局管理。具体内容为:

  1. 绝对布局
  2. 布局类
    • 水平布局(QHBoxLayout)
    • 垂直布局(QVBoxLayout)
    • 网格布局(QGridLayout)
    • 表单布局(QFormLayout)
  3. 嵌套布局
  4. 布局管理器QSplitter

二 绝对布局

绝对布局主要用到两个方法,分别是move()和setGeometry()。

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QLabel, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()
        self.initUI()
        
    def initUI(<span style="color:#a31515">self</span>):
        lb1 = <span style="color:#a31515">QLabel</span>('欢迎', <span style="color:#a31515">self</span>)
        lb1.move(15, 10)
        lb2 = <span style="color:#a31515">QLabel</span>('学习', <span style="color:#a31515">self</span>)
        lb2.move(35, 40)
        lb3 = <span style="color:#a31515">QLabel</span>('<span style="color:#a31515">PyQt</span> 5', <span style="color:#a31515">self</span>)
        lb3.move(55, 70)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('<span style="color:#a31515">PyQt</span> 5中的绝对定位')
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

绝对布局的优点:

  • 可以直接定位每个控件的位置

绝对布局的缺点:

  • 如果改变一个窗口的大小,窗口中控件的大小和位置不会随之改变
  • 所生成的窗口在不同的操作系统下看起来可能不一样
  • 在程序中改变字体时可能会破坏布局
  • 如果修改布局,比如新增一个控件,就必须全部重新布局,既烦琐又费时

三 布局类

3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout)

本小节涉及到的方法及其描述如下:

方法描述
addLayout(self, QLayout, stretch = 0)在窗口中添加布局,stretch为伸缩量,默认为0
addWidget(self, QWidget, stretch, Qt.Alignment alignment)在布局中添加控件,stretch为伸缩量,alignment为对齐方式
addSpacing(self, int)添加伸缩量,具体使用方法见下面的例子

对齐方式Qt.Alignment可能取值有:

参数描述
Qt.AlignLeft水平居左对齐
Qt.AlignRight水平居右对齐
Qt.AlignCenter水平居中对齐
Qt.AlignJustify水平两端对齐
Qt.AlignTop垂直靠上对齐
Qt.AlignBottom垂直靠下对齐
Qt.AlignVCenter垂直居中对齐

3.2 水平布局和垂直布局实例

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QPushButton, QHBoxLayout, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()

        hbox = <span style="color:#a31515">QHBoxLayout</span>()
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(1)))
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(2)))
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(3)))
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(4)))
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(5)))
        self.setLayout(<span style="color:#a31515">hbox</span>)

        self.setWindowTitle('<span style="color:#a31515">QHBoxLayout</span>')
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtCore</span> <span style="color:#0000ff">import</span> Qt
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QPushButton, QHBoxLayout, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()

        hbox = <span style="color:#a31515">QHBoxLayout</span>()
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(1)), 0, <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignTop</span>)
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(2)), 0, <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignTop</span> | <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignLeft</span>)
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(3)), 0)
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(4)), 0, <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignLeft</span> | <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignBottom</span>)
        hbox.addWidget(<span style="color:#a31515">QPushButton</span>(<span style="color:#a31515">str</span>(5)), 0, <span style="color:#a31515">Qt</span>.<span style="color:#a31515">AlignTop</span>)

        self.setLayout(<span style="color:#a31515">hbox</span>)
        self.setWindowTitle('水平布局')
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

关于addSpacing()的用法见下面的实例。

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QPushButton, QHBoxLayout, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()

        btn1 = <span style="color:#a31515">QPushButton</span>()
        btn2 = <span style="color:#a31515">QPushButton</span>()
        btn3 = <span style="color:#a31515">QPushButton</span>()
        btn1.setText(<span style="color:#a31515">str</span>(1))
        btn2.setText(<span style="color:#a31515">str</span>(2))
        btn3.setText(<span style="color:#a31515">str</span>(3))

        # addSpacing(1)表示设置伸缩量为1
        hbox = <span style="color:#a31515">QHBoxLayout</span>()
        hbox.addStretch(1)
        hbox.addWidget(<span style="color:#a31515">btn1</span>)
        hbox.addStretch(1)
        hbox.addWidget(<span style="color:#a31515">btn2</span>)
        hbox.addStretch(1)
        hbox.addWidget(<span style="color:#a31515">btn3</span>)
        hbox.addStretch(1)

        self.setLayout(<span style="color:#a31515">hbox</span>)
        self.setWindowTitle('<span style="color:#a31515">addStretch'</span>)
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QPushButton, QHBoxLayout, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()

        btn1 = <span style="color:#a31515">QPushButton</span>()
        btn2 = <span style="color:#a31515">QPushButton</span>()
        btn3 = <span style="color:#a31515">QPushButton</span>()
        btn1.setText(<span style="color:#a31515">str</span>(1))
        btn2.setText(<span style="color:#a31515">str</span>(2))
        btn3.setText(<span style="color:#a31515">str</span>(3))

        hbox = <span style="color:#a31515">QHBoxLayout</span>()
        hbox.addStretch(0)
        hbox.addWidget(<span style="color:#a31515">btn1</span>)
        hbox.addWidget(<span style="color:#a31515">btn2</span>)
        hbox.addWidget(<span style="color:#a31515">btn3</span>)
        hbox.addStretch(0)

        self.setLayout(<span style="color:#a31515">hbox</span>)
        self.setWindowTitle('<span style="color:#a31515">addStretch'</span>)
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

3.3 网格布局(QGridLayout)

网格布局需要用到的方法及其描述如下。

方法描述
addWidget(QWidget widget, int row, int col, int alignment = 0)给网格布局添加控件。
widget:要添加的控件
row:位置所在行
col:位置所在列
alignment:对齐方式
addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, int alignment)当所添加的控件跨越多行或多列时,使用这个函数
fromRow:起始行
fromColumn:起始列
rowSpan:控件跨越的行
columnSpan:控件跨越的列
setSpacing(int spacing)设置控件在水平和垂直方向的间隔

3.4 网格布局实例

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">#!/usr/bin/env python3
# -*- coding: utf-<span style="color:#880000">8</span> -*-

import sys
from PyQt5.QtWidgets import QWidget, QGridLayout, QPushButton, QApplication

class <span style="color:#0000ff">Window</span>(QWidget):
    def <span style="color:#0000ff">__init__</span>(self):
        <span style="color:#0000ff">super</span>().<span style="color:#0000ff">__init__</span>()
        self.<span style="color:#0000ff">initUI</span>()

    def <span style="color:#0000ff">initUI</span>(self):
        grid = <span style="color:#0000ff">QGridLayout</span>()
        self.<span style="color:#0000ff">setLayout</span>(grid)

        names = [<span style="color:#a31515">'Cls'</span>, <span style="color:#a31515">'Back'</span>, <span style="color:#a31515">''</span>, <span style="color:#a31515">'Close'</span>,
                <span style="color:#a31515">'7'</span>, <span style="color:#a31515">'8'</span>, <span style="color:#a31515">'9'</span>, <span style="color:#a31515">'/'</span>,
                <span style="color:#a31515">'4'</span>, <span style="color:#a31515">'5'</span>, <span style="color:#a31515">'6'</span>, <span style="color:#a31515">'*'</span>,
                <span style="color:#a31515">'1'</span>, <span style="color:#a31515">'2'</span>, <span style="color:#a31515">'3'</span>, <span style="color:#a31515">'-'</span>,
                <span style="color:#a31515">'0'</span>, <span style="color:#a31515">'.'</span>, <span style="color:#a31515">'='</span>, <span style="color:#a31515">'+'</span>]
        positions = [(i, j) for i in <span style="color:#0000ff">range</span>(<span style="color:#880000">5</span>) for j in <span style="color:#0000ff">range</span>(<span style="color:#880000">4</span>)]
        for position, name in <span style="color:#0000ff">zip</span>(positions, names):
            if name == <span style="color:#a31515">''</span>:
                continue
            btn = <span style="color:#0000ff">QPushButton</span>(name)
            grid.<span style="color:#0000ff">addWidget</span>(btn, *position)

        self.<span style="color:#0000ff">move</span>(<span style="color:#880000">300</span>, <span style="color:#880000">150</span>)
        self.<span style="color:#0000ff">setWindowTitle</span>(<span style="color:#a31515">'网格布局'</span>)
        self.<span style="color:#0000ff">show</span>()

if __name__ == <span style="color:#a31515">'__main__'</span>:
    app = <span style="color:#0000ff">QApplication</span>(sys.argv)
    w = <span style="color:#0000ff">Window</span>()
    sys.<span style="color:#0000ff">exit</span>(app.<span style="color:#0000ff">exec_</span>())
</code></span></span>

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()
        self.initUI()

    def initUI(<span style="color:#a31515">self</span>):
        title = <span style="color:#a31515">QLabel</span>('标题')
        author = <span style="color:#a31515">QLabel</span>('提交人')
        review = <span style="color:#a31515">QLabel</span>('申告内容')

        titleEdit = <span style="color:#a31515">QLineEdit</span>()
        authorEdit = <span style="color:#a31515">QLineEdit</span>()
        reviewEdit = <span style="color:#a31515">QTextEdit</span>()

        grid = <span style="color:#a31515">QGridLayout</span>()
        grid.setSpacing(10)
        self.setLayout(<span style="color:#a31515">grid</span>)

        grid.addWidget(<span style="color:#a31515">title</span>, 0, 0)
        grid.addWidget(<span style="color:#a31515">titleEdit</span>, 0, 1)
        grid.addWidget(<span style="color:#a31515">author</span>, 1, 0)
        grid.addWidget(<span style="color:#a31515">authorEdit</span>, 1, 1)
        grid.addWidget(<span style="color:#a31515">review</span>, 2, 0)
        grid.addWidget(<span style="color:#a31515">reviewEdit</span>, 2, 1, 2, 1)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('故障申报')
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

3.5 表单布局(QFormLayout)

QFormLayout是label-field式的表单布局,顾名思义,就是实现表单方式的布局。表单是提示用户进行交互的一种模式,其主要由两列组成,第一列用于显示信息,给用户提示,一般叫做label域;第二列需要用户进行选择或者输入,一般叫做field域。label与field的关系就是label关联field。

QFormLayout需要用到addRow(label, field)方法。

3.6 表单布局实例

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>
<span style="color:#2b91af"># -*- coding: utf-8 -*-</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QFormLayout, QLabel, QLineEdit, QApplication

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()
        self.initUI()

    def initUI(<span style="color:#a31515">self</span>):
        form = <span style="color:#a31515">QFormLayout</span>()

        lb1 = <span style="color:#a31515">QLabel</span>('标签1')
        le1 = <span style="color:#a31515">QLineEdit</span>()
        lb2 = <span style="color:#a31515">QLabel</span>('标签2')
        le2 = <span style="color:#a31515">QLineEdit</span>()
        lb3 = <span style="color:#a31515">QLabel</span>('标签3')
        le3 = <span style="color:#a31515">QLineEdit</span>()

        form.addRow(<span style="color:#a31515">lb1</span>, <span style="color:#a31515">le1</span>)
        form.addRow(<span style="color:#a31515">lb2</span>, <span style="color:#a31515">le2</span>)
        form.addRow(<span style="color:#a31515">lb3</span>, <span style="color:#a31515">le3</span>)

        self.resize(400, 100)
        self.setLayout(<span style="color:#a31515">form</span>)
        self.setWindowTitle('<span style="color:#a31515">QFormLayout</span>')
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

3.7 嵌套布局

所谓嵌套布局就是综合应用上述的布局进行嵌套以完成整体窗口的布局。下面是有关嵌套布局的两个等价实例。注意第二个实例更加简单。

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">#!/usr/bin/env python3
# -*- coding: utf-<span style="color:#880000">8</span> -*-

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

class <span style="color:#0000ff">Window</span>(QWidget):
    def <span style="color:#0000ff">__init__</span>(self):
        <span style="color:#0000ff">super</span>().<span style="color:#0000ff">__init__</span>()
        self.<span style="color:#0000ff">setWindowTitle</span>(<span style="color:#a31515">'嵌套布局'</span>)

        # 全局布局:水平
        wlayout = <span style="color:#0000ff">QHBoxLayout</span>()
        # 局部布局:水平,垂直,网格,表单
        hlayout = <span style="color:#0000ff">QHBoxLayout</span>()
        vlayout = <span style="color:#0000ff">QVBoxLayout</span>()
        glayout = <span style="color:#0000ff">QGridLayout</span>()
        flayout = <span style="color:#0000ff">QFormLayout</span>()

        # 为局部布局添加控件
        hlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">1</span>)))
        hlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">2</span>)))
        vlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">3</span>)))
        vlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">4</span>)))
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">5</span>)), <span style="color:#880000">0</span>, <span style="color:#880000">0</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">6</span>)), <span style="color:#880000">0</span>, <span style="color:#880000">1</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">7</span>)), <span style="color:#880000">1</span>, <span style="color:#880000">0</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">8</span>)), <span style="color:#880000">1</span>, <span style="color:#880000">1</span>)
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">9</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">10</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">11</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">12</span>)))

        # 准备<span style="color:#880000">4</span>个控件
        hwg = <span style="color:#0000ff">QWidget</span>()
        vwg = <span style="color:#0000ff">QWidget</span>()
        gwg = <span style="color:#0000ff">QWidget</span>()
        fwg = <span style="color:#0000ff">QWidget</span>()

        # 使用<span style="color:#880000">4</span>个控件设置局部布局
        hwg.<span style="color:#0000ff">setLayout</span>(hlayout)
        vwg.<span style="color:#0000ff">setLayout</span>(vlayout)
        gwg.<span style="color:#0000ff">setLayout</span>(glayout)
        fwg.<span style="color:#0000ff">setLayout</span>(flayout)

        # 将<span style="color:#880000">4</span>个控件添加到全局布局中
        wlayout.<span style="color:#0000ff">addWidget</span>(hwg)
        wlayout.<span style="color:#0000ff">addWidget</span>(vwg)
        wlayout.<span style="color:#0000ff">addWidget</span>(gwg)
        wlayout.<span style="color:#0000ff">addWidget</span>(fwg)

        self.<span style="color:#0000ff">setLayout</span>(wlayout)
        self.<span style="color:#0000ff">show</span>()

if __name__ == <span style="color:#a31515">'__main__'</span>:
    app = <span style="color:#0000ff">QApplication</span>(sys.argv)
    w = <span style="color:#0000ff">Window</span>()
    sys.<span style="color:#0000ff">exit</span>(app.<span style="color:#0000ff">exec_</span>())
</code></span></span>

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-css">#!/usr/bin/env python3

import sys
<span style="color:#0000ff">from</span> PyQt5<span style="color:#880000">.QtWidgets</span> import QApplication, QWidget, QHBoxLayout, QVBoxLayout, \
                            QGridLayout, QFormLayout, QPushButton

class Window(QWidget):
    def <span style="color:#0000ff">__init__</span>(self):
        <span style="color:#0000ff">super</span>().<span style="color:#0000ff">__init__</span>()
        self.<span style="color:#0000ff">setWindowTitle</span>(<span style="color:#a31515">'嵌套布局'</span>)
        self.<span style="color:#0000ff">resize</span>(<span style="color:#880000">700</span>, <span style="color:#880000">200</span>)

        # 全局控件(注意参数self),用于承载全局布局
        wwg = <span style="color:#0000ff">QWidget</span>(self)

        # 全局布局
        wl = <span style="color:#0000ff">QHBoxLayout</span>(wwg)
        hlayout = <span style="color:#0000ff">QHBoxLayout</span>()
        vlayout = <span style="color:#0000ff">QVBoxLayout</span>()
        glayout = <span style="color:#0000ff">QGridLayout</span>()
        flayout = <span style="color:#0000ff">QFormLayout</span>()

        # 为局部布局添加控件
        hlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">1</span>)))
        hlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">2</span>)))
        vlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">3</span>)))
        vlayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">4</span>)))
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">5</span>)), <span style="color:#880000">0</span>, <span style="color:#880000">0</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">6</span>)), <span style="color:#880000">0</span>, <span style="color:#880000">1</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">7</span>)), <span style="color:#880000">1</span>, <span style="color:#880000">0</span>)
        glayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">8</span>)), <span style="color:#880000">1</span>, <span style="color:#880000">1</span>)
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">9</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">10</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">11</span>)))
        flayout.<span style="color:#0000ff">addWidget</span>(<span style="color:#0000ff">QPushButton</span>(<span style="color:#0000ff">str</span>(<span style="color:#880000">12</span>)))

        # 在布局布局wl中添加局部布局
        wl.<span style="color:#0000ff">addLayout</span>(hlayout)
        wl.<span style="color:#0000ff">addLayout</span>(vlayout)
        wl.<span style="color:#0000ff">addLayout</span>(glayout)
        wl.<span style="color:#0000ff">addLayout</span>(flayout)

        self.<span style="color:#0000ff">show</span>()

if __name__ == <span style="color:#a31515">'__main__'</span>:
    app = <span style="color:#0000ff">QApplication</span>(sys.argv)
    w = <span style="color:#0000ff">Window</span>()
    sys.<span style="color:#0000ff">exit</span>(app.<span style="color:#0000ff">exec_</span>())
</code></span></span>

3.8 布局管理器QSplitter

PyQt提供了一个特殊的布局管理器QSplitter,它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器。

与QSplitter相关的方法及其描述如下。

方法描述
addWidget()将控件添加到QSplitter管理器的布局中
indexOf()返回控件在QSplitter管理器中的索引
insertWidget()根据索引将一个控件插入到QSplitter管理器中
setOrientation()设置布局方法
Qt.Horizontal:水平方向
Qt.Vertical:垂直方向
setSizes()设置控件的初始化大小
count()返回小控件在QSplitter管理器中的数量
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-haskell"><span style="color:#2b91af">#!/usr/bin/env python3</span>

<span style="color:#0000ff">import</span> sys
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtWidgets</span> <span style="color:#0000ff">import</span> QWidget, QHBoxLayout, QSplitter, QTextEdit, \
                            <span style="color:#a31515">QApplication</span>, <span style="color:#a31515">QFrame</span>
<span style="color:#a31515">from</span> <span style="color:#a31515">PyQt5</span>.<span style="color:#a31515">QtCore</span> <span style="color:#0000ff">import</span> Qt

<span style="color:#0000ff">class</span> <span style="color:#a31515">Window</span>(<span style="color:#a31515">QWidget</span>):
    def __init__(<span style="color:#a31515">self</span>):
        super().__init__()
        self.initUI()

    def initUI(<span style="color:#a31515">self</span>):
        hbox = <span style="color:#a31515">QHBoxLayout</span>(<span style="color:#a31515">self</span>)
        self.setWindowTitle('<span style="color:#a31515">QSplitter</span>')
        self.setGeometry(300, 300, 300, 200)

        topleft = <span style="color:#a31515">QFrame</span>()
        topleft.setFrameShape(<span style="color:#a31515">QFrame</span>.<span style="color:#a31515">StyledPanel</span>)

        bottom = <span style="color:#a31515">QFrame</span>()
        bottom.setFrameShape(<span style="color:#a31515">QFrame</span>.<span style="color:#a31515">StyledPanel</span>)

        sp1 = <span style="color:#a31515">QSplitter</span>(<span style="color:#a31515">Qt</span>.<span style="color:#a31515">Horizontal</span>)
        te = <span style="color:#a31515">QTextEdit</span>()
        sp1.addWidget(<span style="color:#a31515">topleft</span>)
        sp1.addWidget(<span style="color:#a31515">te</span>)
        sp1.setSizes([100, 200])

        sp2 = <span style="color:#a31515">QSplitter</span>(<span style="color:#a31515">Qt</span>.<span style="color:#a31515">Vertical</span>)
        sp2.addWidget(<span style="color:#a31515">sp1</span>)
        sp2.addWidget(<span style="color:#a31515">bottom</span>)

        hbox.addWidget(<span style="color:#a31515">sp2</span>)
        self.setLayout(<span style="color:#a31515">hbox</span>)
        self.show()

if __name__ == '__main__':
    app = <span style="color:#a31515">QApplication</span>(<span style="color:#a31515">sys</span>.<span style="color:#a31515">argv</span>)
    w = <span style="color:#a31515">Window</span>()
    sys.exit(<span style="color:#a31515">app</span>.<span style="color:#a31515">exec_</span>())
</code></span></span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值