QStackedLayout介绍
QStackedLayout 是 Qt 中的一个布局管理器,用于管理多个子窗口或页面的堆叠显示。它允许你在一个固定区域内显示多个子窗口,但每次只显示其中一个子窗口,其他子窗口被堆叠在后面。与 QStackedWidget 类似,但 QStackedLayout 是一个布局管理器,可以与其他布局管理器一起使用。
QStackedLayout的常用函数
将子窗口或页面添加到堆叠布局中
QStackedLayout *stackedLayout = new QStackedLayout;
QWidget *page1 = new QWidget;
QWidget *page2 = new QWidget;
stackedLayout->addWidget(page1);
stackedLayout->addWidget(page2);
在指定索引位置插入子窗口或页面
stackedLayout->insertWidget(1, page3); // 在第二个位置插入一个页面
设置当前显示的子窗口的索引
stackedLayout->setCurrentIndex(1); // 显示第二个子窗口
获取当前显示的子窗口的索引
int index = stackedLayout->currentIndex();
获取堆叠布局中子窗口的数量
stackedLayout->setCurrentWidget(page2); // 显示第二个子窗口
设置当前显示的子窗口为指定的子窗口对象
stackedLayout->setCurrentWidget(page2); // 显示第二个子窗口
获取当前显示的子窗口的指针
QWidget *currentPage = stackedLayout->currentWidget();
切换到下一个或上一个子窗口,带有滑动效果
stackedLayout->slideInNext();
stackedLayout->slideInPrev();
这些函数可以帮助我们配置和管理 QStackedLayout 布局管理器,以便在一个固定区域内显示多个子窗口,并根据需要切换它们。可以使用这些函数来创建多页的用户界面,如向导、选项卡和多视图应用程序。通过连接 currentChanged 信号,你还可以监测子窗口的切换事件。
QStackedLayout示例
#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);
}