Qt系列文章目录

文章目录

前言

我们在使用Qt设计复杂界面的时候:一般都会设计出一个主界面,主界面包含几个主要窗口,可以拖拽和相互停靠。其中窗口2是主要的三维渲染展示窗口,窗口1和窗口3里面也有很多的内部布局。我们首先想到的是使用QDockWidget来设置窗口1、窗口2、窗口3,其中这3个窗口里面也会显示各种widget窗口。我们一般都会想到使用QTableView/QTableWidget等控件来显示当前哪个窗口显示,哪些窗口隐藏。这时候QStackedWidget控件使用起来更方便。

QStackedWidget 控件使用详解_qt


visual studio也是这样的风格

QStackedWidget 控件使用详解_源码下载_02

一、QStackedWidget

1.​​QStackedWidget 官方文档​​ QStackedWidget 控件相当于一个容器,提供一个空间来存放一系列的控件,并且每次只能有一个控件是可见的,即被设置为当前的控件。QStackedWidget可用于创建类似于QTabWidget提供的用户界面。它是一个构建在QStackedLayout类之上的方便布局小部件。与QStackedLayout一样,QStacked Widget可以构建并填充许多子Widget(“页面”):

2.常用接口

QStackedWidget 控件使用详解_QStackedWidget_03

*firstPageWidget = new QWidget;
QWidget *secondPageWidget = new QWidget;
QWidget *thirdPageWidget = new QWidget;

QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(firstPageWidget);
stackedWidget->addWidget(secondPageWidget);
stackedWidget->addWidget(thirdPageWidget);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(stackedWidget);
setLayout(layout);

QStackedWidget没有为用户提供切换页面的内在方法。这通常通过QComboBox或QListWidget来完成,QListWidget存储QStackedWidget页面的标题。例如

*pageComboBox = new QComboBox;
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
connect(pageComboBox, QOverload<int>::of(&QComboBox::activated),
stackedWidget, &QStackedWidget::setCurrentIndex);

例子

1.头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QStackedWidget>
#include <QLabel>
#include <QGridLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

QWidget *pwind;
//上方三个按钮
QPushButton *btnT1;
QPushButton *btnT2;
QPushButton *btnT3;


//设置三个QStackedWidget 页面,每个页面包含一个按钮(当然这里面的按钮只是看看);
QStackedWidget *m_pStackedWidget;
QPushButton *btnT4;
QPushButton *btnT5;
QPushButton *btnT6;

public slots:
void switchPage(int nIndex);//切换设置
void sss1();//链接按钮的槽
void sss2();
void sss3();


private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

2.实现文件

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

pwind = new QWidget;
setCentralWidget(pwind);
QPushButton *btnT1= new QPushButton("btn1");
QPushButton *btnT2= new QPushButton("btn2");
QPushButton *btnT3= new QPushButton("btn3");

QLabel *pttt1= new QLabel(u8"----->",this);
QLabel *pttt2= new QLabel(u8"----->",this);

m_pStackedWidget = new QStackedWidget();
btnT4 = new QPushButton(u8"子页面1");
btnT5 = new QPushButton(u8"子页面2");
btnT6 = new QPushButton(u8"子页面3");

m_pStackedWidget->addWidget(btnT4);
m_pStackedWidget->addWidget(btnT5);
m_pStackedWidget->addWidget(btnT6);

QGridLayout *pLayout = new QGridLayout();
pLayout->addWidget(btnT1,0,0);
pLayout->addWidget(pttt1,0,1);
pLayout->addWidget(btnT2,0,2);
pLayout->addWidget(pttt2,0,3);
pLayout->addWidget(btnT3,0,4);
pLayout->addWidget(m_pStackedWidget,1,0,2,5); //addWidget(待添加QWidget,行数,列数,跨越行数,跨越列数);后面的参数可以缺省


pwind->setLayout(pLayout);
connect(btnT1, &QPushButton::clicked, this, &MainWindow::sss1);
connect(btnT2, &QPushButton::clicked, this, &MainWindow::sss2);
connect(btnT3, &QPushButton::clicked, this, &MainWindow::sss3);//通过控制sss1、sss2、sss3的参数变化,来实现对switchPage(int nIndex)的控制
}

MainWindow::~MainWindow()
{
delete ui;
}


void MainWindow::sss1()//设定显示页面1
{
int i = 0;
switchPage(i);//将要显示的页面编号传递给switchPage(int nIndex);
}
void MainWindow::sss2()//设定显示页面2
{
int i = 1;
switchPage(i);
}
void MainWindow::sss3()//设定显示页面3
{
int i = 2;
switchPage(i);
}
void MainWindow::switchPage(int nIndex)
{
m_pStackedWidget->setCurrentIndex(nIndex);
}

源码下载

​源码下载地址​