8.堆栈窗体

一、堆栈窗体–QStackedWidget
1.方法

Public Functions
	QStackedWidget(QWidget * parent = 0)
	
	int	addWidget(QWidget * widget)
		增加窗体,增加完后默认会分配一个index值,从0开始
		
	int	currentIndex() const  
		得到当前显示窗体的index值

Public Slots
	void	setCurrentIndex(int index)
		设置第index页面为栈顶(显示页面) //一般用这个
	void	setCurrentWidget(QWidget *widget)

Signals
	void currentChanged(int index)
		窗体发生变化后,发出信号,index代表更换后窗体index值

实例:使用UI编辑器,左边使用QListWidget显示窗体列表,右边使用stackwidget显示窗体内容。
点击左边窗体列表后,相应右边窗体发生变化。

尝试:把stackwidget上的每个窗体的代码进行分离(每个窗体使用一个类来实现)。

新建带ui编辑器的类:新建–》qt-》qt设计师界面类
使用上述方法建立的类是独立源码文件和界面文件。

#ifndef STACKWIG_H
#define STACKWIG_H

#include <QtWidgets>

class StackWig : public QWidget
{
    Q_OBJECT

public:
    StackWig(QWidget *parent = 0);
    ~StackWig();
};

#endif // STACKWIG_H
#include "stackwig.h"
#include "thirdpagewidget.h"
#include "thirdpage.h"

StackWig::StackWig(QWidget *parent)
    : QWidget(parent)
{
    //创建了三个子部件界面
    QWidget *firstPageWidget = new QWidget;
    QPushButton *btn1 = new QPushButton("btn1" ,firstPageWidget);

    QWidget *secondPageWidget = new QWidget;
    QPushButton *btn2 = new QPushButton("btn2" ,secondPageWidget);

    ThirdPage *thirdPageWidget = new ThirdPage;


    //初始化了一个堆栈窗体
    QStackedWidget *stackedWidget = new QStackedWidget;
    stackedWidget->addWidget(firstPageWidget);
    stackedWidget->addWidget(secondPageWidget);
    stackedWidget->addWidget(thirdPageWidget);

    //初始化了一个列表框
    QComboBox *pageComboBox = new QComboBox;
    pageComboBox->addItem(tr("Page 1"));
    pageComboBox->addItem(tr("Page 2"));
    pageComboBox->addItem(tr("Page 3"));

    //初始化了一个纵向布局
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(pageComboBox);
    layout->addWidget(stackedWidget);
    setLayout(layout);  //设置当前窗体的布局为layout

    //列表框发生改变,引起堆栈窗体窗口变化
    connect(pageComboBox, SIGNAL(activated(int)),
            stackedWidget, SLOT(setCurrentIndex(int)));

    this->resize(300, 300);
}

StackWig::~StackWig()
{

}

**

使用UI编辑器进行界面堆栈窗口操作

**

#include "stackedit.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    StackEdit w;
    w.show();

    return a.exec();
}

#ifndef STACKEDIT_H
#define STACKEDIT_H

#include <QWidget>

namespace Ui {
class StackEdit;
}

class StackEdit : public QWidget
{
    Q_OBJECT

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

private:
    Ui::StackEdit *ui;
};

#endif // STACKEDIT_H
#include "stackedit.h"
#include "ui_stackedit.h"
#include "form1.h"
#include "form2.h"
#include "form3.h"

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

    //把子界面添加到ui编辑器中的stackwig中
    Form1 *wig1 = new Form1;
    Form2 *wig2 = new Form2;
    Form3 *wig3 = new Form3;

    ui->stackedWidget->addWidget(wig1);
    ui->stackedWidget->addWidget(wig2);
    ui->stackedWidget->addWidget(wig3);

    //连接listwig和stackwig的信号和槽
    QObject::connect(ui->listWidget, SIGNAL(currentRowChanged(int)),
                     ui->stackedWidget,  SLOT(setCurrentIndex(int)));
}

StackEdit::~StackEdit()
{
    delete ui;
}
/*
*from1.c
*from1.h
*from2.c
*from2.h
*from3.c
*from3.h
*/
#ifndef FORM1_H
#define FORM1_H

#include <QWidget>

namespace Ui {
class Form1;
}

class Form1 : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Form1 *ui;
};

#endif // FORM1_H
/************分割线*******************/
#include "form1.h"
#include "ui_form1.h"

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

Form1::~Form1()
{
    delete ui;
}
发布了10 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40083589/article/details/94025969