qt 实现导航栏切换页面功能 QStackedLayout

 QStackedLayout类提供了多页面切换的布局,一次只能看到一个界面。该类的继承层次结构如下:

(QObject,QLayoutltem) - QLayout - QStackedLayout

构造函数为:

QStackedLayout([QWidget parent])

与QFormLayout一样,不是QWidget类的继承者,因此没有自己的窗口,不能单独使用。 因此,容器作为子控件使用。要在构造函数中指定父组件。如果没有,可将容器作参数,调用父组件的setLayout( )方法。

项目结构:

 项目代码:

#include "widget.h"
#include "ui_widget.h"


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

    //初始化
    stackLayout = new QStackedLayout;

    m_pageOne = new PageOne(ui->widget_2);//加上()之后才能在当前页切换,不新跳出窗口
    m_pageTwo = new PageTwo(ui->widget_2);//加上()之后才能在当前页切换,不新跳出窗口
    m_pageThree = new PageThree(ui->widget_2);//加上()之后才能在当前页切换,不新跳出窗口
//    m_pageOne->setParent(ui->widget_2);
//    m_pageTwo->setParent(ui->widget_2);
//    m_pageThree->setParent(ui->widget_2);

    stackLayout->addWidget(m_pageOne);      //第一页
    stackLayout->addWidget(m_pageTwo);      //第二页
    stackLayout->addWidget(m_pageThree);    //第二页
    stackLayout->setCurrentIndex(0);        //默认stackLayout显示第0页

    ui->widget_2->setLayout(stackLayout);
//    setLayout(stackLayout);//设置唯一布局

    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(On_PushButton1Result()));
    connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(On_PushButton2Result()));
    connect(ui->pushButton_3,SIGNAL(clicked(bool)),this,SLOT(On_PushButton3Result()));
//    ui->widget->raise();
}

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

void Widget::On_PushButton1Result()
{
    //按钮1槽函数
    stackLayout->setCurrentIndex(0);        //切换到stackLayout第一页
    ui->pushButton->setStyleSheet("background-color: rgb(35, 39, 46);color: rgb(255, 255, 255);");
    ui->pushButton_2->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
    ui->pushButton_3->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
    //m_pageOne->show();//show hide 也可实现
    // widget置于上层
//    ui->widget->raise();
}

void Widget::On_PushButton2Result()
{
    //按钮2槽函数
    stackLayout->setCurrentIndex(1);        //切换到stackLayout第二页
    ui->pushButton->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
    ui->pushButton_2->setStyleSheet("background-color: rgb(35, 39, 46);color: rgb(255, 255, 255);");
    ui->pushButton_3->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
//    ui->widget->raise();
}

void Widget::On_PushButton3Result()
{
    //按钮3槽函数
    stackLayout->setCurrentIndex(2);        //切换到stackLayout第三页
    ui->pushButton->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
    ui->pushButton_2->setStyleSheet("background-color: rgb(16, 17, 20);color: rgb(154, 160, 177);");
    ui->pushButton_3->setStyleSheet("background-color: rgb(35, 39, 46);color: rgb(255, 255, 255);");
//    ui->widget->raise();
}

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStackedLayout>
#include "pageone.h"
#include "pagetwo.h"
#include "pagethree.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void On_PushButton1Result();
    void On_PushButton2Result();
    void On_PushButton3Result();

public:
    Ui::Widget *ui;

private:
    QStackedLayout *stackLayout;
    PageOne *m_pageOne;
    PageTwo *m_pageTwo;
    PageThree *m_pageThree;
};

#endif // WIDGET_H
#include "pageone.h"
#include "ui_pageone.h"

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

PageOne::~PageOne()
{
    delete ui;
}
#ifndef PAGEONE_H
#define PAGEONE_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class PageOne; }
QT_END_NAMESPACE
class PageOne : public QWidget
{
    Q_OBJECT
public:
    explicit PageOne(QWidget *parent = nullptr);
    ~PageOne();

private:
    Ui::PageOne *ui;

};

#endif // PAGEONE_H

 项目预览:

 

Qt布局管理详解(5种布局控件) Qt布局管理详解(5种布局控件)

Qt布局之QStackedLayout

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值