QT——一个窗口显示多个界面,点击按钮切换界面:QStackedWidget

QStackedWidgetd

在学习QT的过程中想到能不能实现类似Android的Freagment,点击按钮在一个窗口中跳转多个界面
创建工程
创建工程时将累信息——基类——修改为QWidget,不然会出现运行之后窗口上不显示内容的问题

mywidget.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QtWidgets/QWidget>
#include <QLabel>
#include <QGraphicsDropShadowEffect>
#include "ui_mywidget.h"

class QStackedWidget;
class QPushButton;
namespace Ui {
class myWidget;
}

class myWidget : public QWidget
{
    Q_OBJECT

public:
    explicit myWidget(QWidget *parent = 0);
    ~myWidget();

public slots:
    void slt_setPageWidget();//根据所点击的按钮来进行相应widget显示的槽

private:
    Ui::myWidget *ui;
    QStackedWidget *stackWidget;
    QPushButton *pageButton;
    QPushButton *page2Button;
    QPushButton *page3Button;
    QLabel *line;

};

#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include <qgridlayout.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qstackedwidget.h>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
#include <QMovie>
#include <QGraphicsDropShadowEffect>
#include <QLineEdit>
#include <QPixmap>

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    ui->setupUi(this);
    QPalette palette(this->palette());
    palette.setColor(QPalette::Background, Qt::black);
    this->setPalette(palette);
/*----star*************************************标题选项卡布局设置**************************************/
    //创建QStackedWidget对象
    stackWidget = new QStackedWidget;
    //创建几个QPushButton来控制widget的显示
    pageButton = new QPushButton();
    page2Button = new QPushButton();
    line=new QLabel();

    //设置头部按钮的按下,接触,离开三个状态的样式
        //按钮"登录"
    pageButton->setText(u8"登录");

        //按钮"注册"
    page2Button->setText(u8"注册");

    //将两个个按钮的clicked事件绑定到函数
    connect(pageButton, &QPushButton::clicked, this, &myWidget::slt_setPageWidget);
    connect(page2Button, &QPushButton::clicked, this, &myWidget::slt_setPageWidget);
    //创建两个个QWidget对象
    QWidget *widget[3];
/*----end*************************************标题选项卡布局设置**************************************/




/*---star***********************************两个页面的布局操作****************************************/
    for (int i = 0; i < 3; ++i)
    {
        //按照下标进行一下QWidget的区分
        widget[i] = new QWidget;
        widget[i]->resize(400, 400);
        QVBoxLayout *layout = new QVBoxLayout;
        QHBoxLayout *pic_layout = new QHBoxLayout;

        //创建容器设置其样式----star
        QLabel *label = new QLabel();
        //根据下标向不同创建不同的控件
        if(i == 0){
            //登录分页的页面
            label->setText("页面1")
        }
        if(i == 1){
            //注册部分页面
            label->setText("页面1")
        }
        //向图片布局两侧添加弹簧+label+弹簧
        pic_layout->addStretch();
        pic_layout->addWidget(label);
        pic_layout->addStretch();
        //将以上布局置入主布局
        layout->addLayout(pic_layout);
        layout->addStretch();
        //将添加了不同控件的主布局置入到对应的widget[]中
        widget[i]->setLayout(layout);
        //调用stackWidget方法添加三个widget到页面
        stackWidget->addWidget(widget[i]);
    }
/*----end***********************************两个页面的布局操作****************************************/




/*---star***************************创建一个头部选项卡布局并置入两个按钮*********************************/
    QHBoxLayout *menu_bar = new QHBoxLayout;
    menu_bar->addWidget(pageButton);
    menu_bar->addWidget(line);
    menu_bar->addWidget(page2Button);
    menu_bar->addStretch();
/*---end***************************创建一个头部选项卡布局并置入两个按钮*********************************/




/*---star******************************将布局内容显示到窗口*******************************************/
    //将之前创建的:头部选项卡布局,可变页面布局,完成按钮全部置入mainlayout
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(menu_bar);
    mainLayout->addWidget(stackWidget);

    //显示mainlayout布局
    setLayout(mainLayout);
/*---end******************************将布局内容显示到窗口*******************************************/


}


/*---star***********************点击不同的标题选项卡切换不同界面的函数**********************************/
void myWidget::slt_setPageWidget()
{
    //获取触发槽的是哪个部件所发出的信号,并获取到那个指针
    QPushButton *widget = static_cast<QPushButton*>(sender());
    if (widget == pageButton)
    {
        stackWidget->setCurrentIndex(0);//根据触发的按钮来进行所要显示的QWidget
    }
    else if (widget == page2Button)
    {
        stackWidget->setCurrentIndex(1);
    }

}
/*---end*************************点击不同的标题选项卡切换不同界面的函数**********************************/

myWidget::~myWidget()
{

}

主要还是代码控制页面元素的问题,记下来免得以后忘记

猜你喜欢

转载自blog.csdn.net/weixin_40273809/article/details/81209310