一、堆栈窗体–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;
}