Qt之堆栈布局(QStackedLayout)
一、QStackedLayout概述
QStackedLayout
是 Qt 中的一个布局管理器,用于管理多个子窗口或页面的堆叠显示。它允许你在一个固定区域内显示多个子窗口,但每次只显示其中一个子窗口,其他子窗口被堆叠在后面。与 QStackedWidget
类似,但 QStackedLayout
是一个布局管理器,可以与其他布局管理器一起使用。
以下是有关 QStackedLayout
的详细介绍和使用方法:
-
多页容器:
QStackedLayout
允许你将多个子窗口或页面放在一个固定区域内。 -
单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。
-
切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。
二、常用函数介绍
1.addWidget:将子窗口或页面添加到堆叠布局中
1 2 3 4 5 | QStackedLayout *stackedLayout = new QStackedLayout; QWidget *page1 = new QWidget; QWidget *page2 = new QWidget; stackedLayout->addWidget(page1); stackedLayout->addWidget(page2); |
2.insertWidget:在指定索引位置插入子窗口或页面
1 | stackedLayout->insertWidget(1, page3); // 在第二个位置插入一个页面 |
3.setCurrentIndex:设置当前显示的子窗口的索引
1 | stackedLayout->setCurrentIndex(1); // 显示第二个子窗口 |
4.currentIndex:获取当前显示的子窗口的索引
1 | int index = stackedLayout->currentIndex(); |
5.count:获取堆叠布局中子窗口的数量
1 | stackedLayout->setCurrentWidget(page2); // 显示第二个子窗口 |
6.setCurrentWidget:设置当前显示的子窗口为指定的子窗口对象
1 | stackedLayout->setCurrentWidget(page2); // 显示第二个子窗口 |
7.currentWidget:获取当前显示的子窗口的指针
1 | QWidget *currentPage = stackedLayout->currentWidget(); |
8.slideInNext 和 slideInPrev:切换到下一个或上一个子窗口,带有滑动效果
1 2 | stackedLayout->slideInNext(); stackedLayout->slideInPrev(); |
这些函数可以帮助你配置和管理 QStackedLayout
布局管理器,以便在一个固定区域内显示多个子窗口,并根据需要切换它们。你可以使用这些函数来创建多页的用户界面,如向导、选项卡和多视图应用程序。通过连接 currentChanged
信号,你还可以监测子窗口的切换事件。
三、示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include "main_window.h" #include <QLabel> #include <QPushButton> #include <QListWidget> #include <QLineEdit> MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this ->setWindowTitle( "堆栈布局" ); this ->setFixedSize(600, 400); QPushButton *pButton = new QPushButton( "点击切换" , this ); connect(pButton, &QPushButton::clicked, this , &MainWindow::onButtonClicked); QLabel *pFirstPage = new QLabel( this ); pFirstPage->setStyleSheet( "QLabel{background-color:rgb(255, 0, 0)}" ); QLabel *pSecondPage = new QLabel( this ); pSecondPage->setStyleSheet( "QLabel{background-color:rgb(255, 255, 0)}" ); QLabel *pThirdPage = new QLabel( this ); pThirdPage->setStyleSheet( "QLabel{background-color:rgb(255, 0, 255)}" ); // 添加页面(用于切换) m_pStackedLayout = new QStackedLayout(); m_pStackedLayout->addWidget(pFirstPage); m_pStackedLayout->addWidget(pSecondPage); m_pStackedLayout->addWidget(pThirdPage); QVBoxLayout *pLayout = new QVBoxLayout( this ); pLayout->addWidget(pButton, 0, Qt::AlignLeft | Qt::AlignVCenter); pLayout->addLayout(m_pStackedLayout); pLayout->setSpacing(10); pLayout->setContentsMargins(10, 10, 10, 10); this ->setLayout(pLayout); } MainWindow::~MainWindow() { } void MainWindow::onButtonClicked() { int nextPage = (m_pStackedLayout->currentIndex() + 1) % m_pStackedLayout->count(); m_pStackedLayout->setCurrentIndex(nextPage); } |
效果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?