QStackedLayout可以用于创建类似于QTableWidget提供的用户界面(QStackedWidget构建在QStackedLayout之上)。
QStackedLayout没有为用户提供切换页面的内在方法,要实现页面的切换,通常可以通过存储QStackedLayout页面标题的QComBox或QListWidget来完成,代码如下:
# 创建一个QComboBox()类的实例
pageComboBox = QComboBox()
# QComboBox对象增加3个Item
pageComboBox.addItem("Page 1")
pageComboBox.addItem("Page 2")
pageComboBox.addItem("Page 3")
# 设置QComboBox实例对象的活动信号,执行设置QStackedLayout的活动页面的方法
# 把pageCombox对象项目(item)索引传递给setCurrentIndex(int index),实现切换
pageComboBox.activated.connect(stackedLayout.setCurrentIndex)
上面使用setCurrentIndex(int index)实现页面切换,另外,还可以使用setCurrentWidget(QWidget w)来切换指定的页面(传递的参数w 必须是QStackedLayout已经包含的控件),一个完整案例代码如下:
# -*- coding: utf-8 -*-
"""
文件名字:PySide6_StackedLayoutDemo
作者姓名:诚外无物
创建日期:2023/11/14
项目名称:chapter01
"""
import sys
from PySide6.QtWidgets import *
class StackedLayoutDemo(QWidget):
def __init__(self, parent=None):
super(StackedLayoutDemo, self).__init__(parent)
self.setWindowTitle("QStackedLayout布局管理例子")
self.resize(400, 100)
# 创建一个垂直布局实例对象,并添加到主窗口中
layout = QVBoxLayout()
self.setLayout(layout)
# 实例化QComboBox对象(添加3个页面导航)
pageComboBox = QComboBox()
pageComboBox.addItem("导航页面一")
pageComboBox.addItem("导航页面二")
pageComboBox.addItem("导航页面三")
# 把QComboBox对象添加到垂直布局对象中
layout.addWidget(pageComboBox)
# 创建一个QStackedLayout实例对象
stackedLayout = QStackedLayout()
# 把QStackedLayout实例对象添加到垂直布局对象中,在QComboBox对象的下方
layout.addLayout(stackedLayout)
# 创建页面对象1
pageWidget1 = QWidget()
# 实例化一个水平布局对象,并添加到页面对象1中
layout1 = QHBoxLayout()
pageWidget1.setLayout(layout1)
# 把页面对象1添加到QStackedLayout布局对象中
stackedLayout.addWidget(pageWidget1)
# 创建页面对象2
pageWidget2 = QWidget()
# 创建一个垂直布局对象
layout2 = QVBoxLayout()
# 把垂直布局对象添加到页面对象2中
pageWidget2.setLayout(layout2)
# 把页面对象2添加到QStackedLayout实例对象中
stackedLayout.addWidget(pageWidget2)
# 创建页面对象3
pageWidget3 = QWidget()
# 创建一个表单布局对象
layout3 = QFormLayout()
# 把表单布局对象添加到页面对象3中
pageWidget3.setLayout(layout3)
# 把页面布局对象3添加到QStackedLayout布局随想中
stackedLayout.addWidget(pageWidget3)
# 使用for循环,分别在3个布局对象中,添加控件对象
for i in range(5):
# 在水平布局对象中,添加3个按钮对象
layout1.addWidget(QPushButton('button%d' % i))
# 在垂直布局对象中,添加3个按钮对象
layout2.addWidget(QPushButton('button%d' % i))
# 在表单布局对象中,添加3个按钮对象,同时也增加了对应的3个标签对象
layout3.addRow('row%d' % i, QPushButton('button%d' % i))
# 导航与页面链接:通过pageComboBox切换
# 执行setCurrentIndex方法,传递自身的索引值,从而实现页面的切换
pageComboBox.activated.connect(stackedLayout.setCurrentIndex)
# 添加按钮切换导航页面1-3
buttonLayout = QHBoxLayout()
layout.addLayout(buttonLayout)
button1 = QPushButton('切换页面1')
button2 = QPushButton('切换页面2')
button3 = QPushButton('切换页面3')
buttonLayout.addWidget(button1)
buttonLayout.addWidget(button2)
buttonLayout.addWidget(button3)
button1.clicked.connect(lambda: stackedLayout.setCurrentIndex(0))
button2.clicked.connect(lambda: stackedLayout.setCurrentIndex(1))
'''下面一行代码和上一行是同样的效果
button2.clicked.connect(lambda: stackedLayout.setCurrentWidget(pageWidget2))
'''
button3.clicked.connect(lambda: stackedLayout.setCurrentIndex(2))
# 创建了一个标签对象,用来显示页面切换的信息提示
label = QLabel('显示信息')
layout.addWidget(label)
stackedLayout.currentChanged.connect(lambda x: label.setText('切换到页面%d' % (x + 1)))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = StackedLayoutDemo()
form.show()
sys.exit(app.exec())
上面一段代码,也进一步温习前面学习的垂直/水平/表单布局对象的使用。