PyQt编程快速上手
上QQ阅读APP看书,第一时间看更新

1.3.6 布局嵌套

布局管理器除了可以添加控件,还可以添加子布局。我们现在拆分图1-18中的登录界面,将其分成多个子布局,如图1-19和图1-20所示。

图1-19 一个垂直布局(V)中包含两个水平布局(H)

图1-20 一个水平布局(H)中包含两个垂直布局(V)

通过图1-19我们可以看出,username_label和username_line使用水平布局,password_label和password_line也使用水平布局,这两个水平布局被包含在一个垂直布局中,即在QVBoxLayout中添加了两个QHBoxLayout。

通过图1-20我们可以看出,username_label和password_label使用垂直布局,username_line和password_line也使用垂直布局,这两个垂直布局被包含在一个水平布局中,即在QHBoxLayout中添加了两个QVBoxLayout。

示例代码1-11实现了图1-19中的布局嵌套方式。

示例代码1-11

import sys
from PyQt5.QtWidgets import *
 
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        username_label = QLabel('Username:')
        password_label = QLabel('Password:')
        username_line = QLineEdit()
        password_line = QLineEdit()
 
        v_layout = QVBoxLayout()       # 注释1开始
        h1_layout = QHBoxLayout()
        h2_layout = QHBoxLayout()
        h1_layout.addWidget(username_label)
        h1_layout.addWidget(username_line)
        h2_layout.addWidget(password_label)
        h2_layout.addWidget(password_line)
        v_layout.addLayout(h1_layout)
        v_layout.addLayout(h2_layout)
        self.setLayout(v_layout)       # 注释1结束
 
if __name__ == '__main__':
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec())

代码解释:

#1 实例化一个垂直布局管理器和两个水平布局管理器。h1_layout水平布局管理器中添加了username_label和username_line控件,h2_layout水平布局管理器中则添加了password_label和password_line控件。最后v_layout垂直布局管理器调用addLayout()方法依次添加两个水平布局管理器,使它们从上到下垂直排列。

大家可以自行实现图1-20中的布局方式,源码参见资源包中的示例代码1-12。到这里,我们一共已经认识了4种布局管理器并明白了如何进行布局嵌套,这几种布局管理器各有特点,不过常使用的还是QVBoxLayout和QHBoxLayout这两种。

PyQt的一个核心知识点我们已经了解了,那现在跟随笔者再去看一下另一个核心知识点——信号和槽机制。