QStackedWidget 控件使用详解

Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、QStackedWidget
  • 例子
  • 源码下载

前言

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

一、QStackedWidget

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

2.常用接口
QStackedWidget 控件使用详解_第3张图片

	QWidget *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页面的标题。例如

	QComboBox *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 
#include 
#include 
#include 
#include 

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

源码下载

源码下载地址

你可能感兴趣的:(Qt,qt,QStackedWidget)