一、QStackedLayout的介绍(官翻)
QStackedLayout可用于创建类似于QTabWidget提供的用户界面。还有一个基于QStackedLayout构建的便利类QStackedWidget。
QStackedLayout可以填充许多子控件(“页面”)。例如:
firstPageWidget = QWidget()
secondPageWidget = QWidget()
thirdPageWidget = QWidget()
stackedLayout = QStackedLayout()
stackedLayout.addWidget(firstPageWidget)
stackedLayout.addWidget(secondPageWidget)
stackedLayout.addWidget(thirdPageWidget)
mainLayout = QVBoxLayout()
mainLayout.addLayout(stackedLayout)
setLayout(mainLayout)
QStackedLayout没有为用户提供内在的切换页面方法。这通常是通过一个QComboBox或一个存储QStackedLayout页面标题的QListWidget完成的。例如:
pageComboBox = QComboBox()
pageComboBox.addItem(Page 1")
pageComboBox.addItem(Page 2")
pageComboBox.addItem(Page 3")
pageComboBox.activated.connect(stackedLayout.setCurrentIndex)
填充布局时,小部件被添加到内部列表中。indexOf()函数返回该列表中某个控件的索引。可以使用 addWidget() 函数将小部件添加到列表末尾,也可以使用 insertWidget() 函数将其插入给定索引处。removeWidget()函数从布局中删除给定索引处的窗口小部件。布局中包含的小部件数量可以使用count()函数获得。
widget()函数返回给定索引位置的小部件。屏幕上显示的控件的索引由currentIndex()给出,可以使用setCurrentIndex()进行更改。以类似的方式,当前显示的小部件可以使用 currentWidget() 函数进行检索,并使用 setCurrentWidget() 函数进行更改。
每当布局中的当前控件发生变化或从布局中删除控件时,就会分别发出 currentChanged() 和 widgetRemoved() 信号。
后期我们将学习建立在QStackedLayout之上的方便的QStackedWidget。可以想象,QStackedWidget的内部实现不过是一个装载了QStackedLayout的QWidget。
实际上我们常用的还是QStackedWidget,QStackedLayout在基础学习阶段并不常用。
我们看下面的例子,有一个大致理解,再学习相关方法。
from PySide6.QtWidgets import QApplication,QWidget,QStackedLayout,QComboBox,QLabel,\
QVBoxLayout
from PySide6.QtCore import Qt
import sys
class MyWindow(QWidget):
def __init__(self):
super().__init__()
lay = QVBoxLayout(self)
comb = QComboBox()
comb.addItems(["红色页面","蓝色页面","黄色页面"])
comb.currentTextChanged[str].connect(self.change_page)
self.child_lay = QStackedLayout()
lay.addLayout(self.child_lay)
lay.addWidget(comb)
self.lab1 = QLabel()
self.lab1.setStyleSheet("background:red")
self.lab2 = QLabel()
self.lab2.setStyleSheet("background:blue")
self.lab3 = QLabel()
self.lab3.setStyleSheet("background:yellow")
self.child_lay.addWidget(self.lab1)
self.child_lay.addWidget(self.lab2)
self.child_lay.addWidget(self.lab3)
def change_page(self,str):
if str == "红色页面":
self.child_lay.setCurrentWidget(self.lab1)
elif str == "蓝色页面":
self.child_lay.setCurrentWidget(self.lab2)
else:
self.child_lay.setCurrentWidget(self.lab3)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())
运行结果:
comboBox切换后的结果:
二、QStackedLayout的相关方法
API函数 | 参数说明 | 返回值 | 功能作用 |
QStackedLayout(self, parent) | parent: QWidget或 QLayout | None | 创建一个堆栈布局实例 |
addWidget(self, w) | w:QWidget | None | 添加控件 |
insertWidget(self, index, w) | index:int w:QWidget | None | 在指定索引位置插入控件 |
widget(self,index) | index:int | QWidget | 获取指定索引位置的控件 |
removeWidget(self,w) | w:QWidget | None | 删除指定控件 |
setCurrentWidget(self, w) | w:QWidget | None | 设置控件在当前页面显示 |
currentWidget(self) | None | QWidget | 获取当前页面显示的控件 |
setCurrentIndex(self, index) | index:int | None | 以索引的方式设置当前页面显示的控件 |
currentIndex(self) | None | int | 获取当前页面显示控件的索引 |
setStackingMode(self, stackingMode) | stackingMode:QStackedLayout. StackingMode | None | 设置堆叠模式 |
stackingMode(self) | None | QStackedLayout. StackingMode | 获取堆叠模式 |
相关方法都很简单,这里只介绍一下setStackingMode( )方法,他的参数是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
QStackedLayout.StackingMode | StackOne | 0 | 只有当前控件可见。这是默认值 |
StackAll | 1 | 所有小部件都可见。当前小部件只是被提升了。 |
默认的情况我们已经在前面的例子中看到了。StackAll与StackOne的区别在于,当我们设置其mode为StackAll的时候,就可以利用布局来覆盖在其他小部件(例如图形编辑器)之上进行额外绘图的小部件。
也就是说在对于stackedLayout来说,当设置为StackOne时,堆栈中仅加载当前索引的控件,而StackAll是将所有控件都加载进去了。此时,我们还可以使用rasie_( )方法来改变内部控件的层叠关系。
为了看得更明显,在上面的例子里添加下列代码:
self.child_lay.setStackingMode(QStackedLayout.StackingMode.StackAll)
self.lab1.setFixedSize(100, 100)
self.lab2.setFixedSize(200, 200)
运行结果:
三、QStackedLayout的信号
信号 | 传递参数 | 功能描述 |
currentChanged | index:int | 当前显示控件发生改变时发射信号,将正在显示的控件索引发送给槽函数 |
widgetRemoved | index:int | 控件被移除是发射信号,将被移除的控件的索引值发送给槽函数 |