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的一个核心知识点我们已经了解了,那现在跟随笔者再去看一下另一个核心知识点——信号和槽机制。