QStackedWidget可用于创建类似于QTabWidget提供的用户界面。之前要显示不同的内容,都是通过创建子窗口的方式来实现的,这种是属于弹窗式,而QStackedWidget可以实现同一界面切换不同的窗口,相当于把弹窗式的子窗口都绑定到了一个统一的区域,直接切换就可以显示不同子窗口的内容,但是每次只能显示一个子窗口,这个和弹窗不一样。
完整代码下载
百度网盘链接:https://pan.baidu.com/s/1DLOk1ucpAbY8X6Ncu8HYvQ
提取码:kht9优快云下载:https://download.youkuaiyun.com/download/mars_xiaolei/11060743
本示例创建步骤
1、打开Qt Creator,新建一个Qt Widgets Application项目,添加控件Stacked Widget和PushButton,然后再添加3个子窗口类,分别取名为Rng、Edg、Ig,每个子窗口各添加一个Label控件用于显示战队名字。
2、UI设计完后,开始添加代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "rng.h"
#include "edg.h"
#include "ig.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void ChooseWidgets();
private:
Ui::MainWindow *ui;
Rng *rngWidget;
Edg *edgWidget;
Ig *igWidget;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
int firstIndex=0;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置窗口名字
setWindowTitle(tr("LPL战队切换系统"));
Rng *rngWidget=new Rng(this);
Edg *edgWidget=new Edg(this);
Ig *igWidget=new Ig(this);
//添加页面
ui->stackedWidget->addWidget(rngWidget);
ui->stackedWidget->addWidget(edgWidget);
ui->stackedWidget->addWidget(igWidget);
//显示页面作为主页
ui->stackedWidget->setCurrentWidget(rngWidget);
//获取当前页面的序号
firstIndex=ui->stackedWidget->currentIndex();
qDebug()<<"firstIndex:"<<firstIndex;
//连接信号槽
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(ChooseWidgets()));
}
MainWindow::~MainWindow()
{
delete ui;
}
//切换页面
void MainWindow::ChooseWidgets()
{
//获取页面的数量
int nCount = ui->stackedWidget->count();
//获取当前页面的索引
int nIndex = ui->stackedWidget->currentIndex();
//获取下一个需要显示的页面索引
nIndex++;
//当需要显示的页面索引大于等于总页面时,切换至首页
if (nIndex >= nCount)
{
nIndex = firstIndex;
}
//显示当前页面
ui->stackedWidget->setCurrentIndex(nIndex);
}
注意事项
新添加的Stacked Widget控件是有两个空白页面可以切换的,页面的索引是从0开始的,也就是说两个空白页面占据了0和1,如果新添加了页面,那就是索引号从2开始。还要注意的是页面有两种切换方式,一种是索引号,另外一种是按窗口名称,窗口名称这种在切换的时候不太好用,会报错,最好还是使用索引号。
QStackedWidget::setCurrentWidget: widget 0x75ec1490 not contained in stack