Qt之堆栈布局(QStackedLayout)

一、QStackedLayout概述

QStackedLayout 是 Qt 中的一个布局管理器,用于管理多个子窗口或页面的堆叠显示。它允许你在一个固定区域内显示多个子窗口,但每次只显示其中一个子窗口,其他子窗口被堆叠在后面。与 QStackedWidget 类似,但 QStackedLayout 是一个布局管理器,可以与其他布局管理器一起使用。

以下是有关 QStackedLayout 的详细介绍和使用方法:

  1. 多页容器:QStackedLayout 允许你将多个子窗口或页面放在一个固定区域内。

  2. 单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。

  3. 切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。

二、常用函数介绍

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);
}

效果如下:

posted @   TechNomad  阅读(2531)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示