Pyside6 布局管理器(6)--- QStackedLayout的使用

一、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

控件被移除是发射信号,将被移除的控件的索引值发送给槽函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值