注意:
当有若干个组件被添加到同一个布局管理器中,并且将当前布局管理器设置到 某个窗口QWidget时,那么此时就隐式的指定了布局管理器中的所有组件的父组件都是 该 QWidget 组件。
Widget.h
#ifndef _WIDGET_H_
#define _WIDGET_H_
#include <QtGui/QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QStackedLayout>
class Widget : public QWidget
{
Q_OBJECT
private:
//水平布局管理器 管理 上一个 下一个 按钮
QPushButton preBtn;//按键
QPushButton nextBtn;
//创建窗口1 :QWidget + 网格布局管理器 + QLabel
QLabel fLbl1; //标签
QLabel fLbl2;
QLabel fLbl3;
QLabel fLbl4;
//创建窗口2 :QWidget + 表单布局管理器 + QLineEdit
QLineEdit sLineEdit; //文本输入框
//创建窗口3 : QWidget + 垂直布局管理器 + QPushButton
QPushButton tPushBtn1;
QPushButton tPushBtn2;
//栈式布局管理器对象 管理上面3个窗口
QStackedLayout sLayout;
void initControl();
QWidget* get1stPage();
QWidget* get2ndPage();
QWidget* get3rdPage();
private slots:
void onPreBtnClicked();
void onNextBtnClicked();
public:
Widget(QWidget* parent = 0);
~Widget();
};
#endif // _WIDGET_H_
Widget.cpp
#include "Widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QFormLayout>
#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent)
{
initControl();
}
void Widget::initControl()
{
//创建水平,垂直布局管理器对象
QVBoxLayout* vLayout = new QVBoxLayout();
QHBoxLayout* hLayout = new QHBoxLayout();
/*设置 上一步 下一步按钮*/
preBtn.setText("Pre Page");//标签
//在水平 垂直方向对 按键进行扩展
preBtn.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
preBtn.setMinimumSize(160, 30);
nextBtn.setText("Next Page");
nextBtn.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
nextBtn.setMinimumSize(160, 30);
//响应按键
connect(&preBtn, SIGNAL(clicked()), this, SLOT(onPreBtnClicked()));
connect(&nextBtn, SIGNAL(clicked()), this, SLOT(onNextBtnClicked()));
//将两个按键添加到水平布局管理器
hLayout->addWidget(&preBtn);
hLayout->addWidget(&nextBtn);
//向栈式布局管理器添加 三个组件
sLayout.addWidget(get1stPage());//下标0
sLayout.addWidget(get2ndPage());//下标1
sLayout.addWidget(get3rdPage());//下标2
//垂直布局管理器 管理 水平布局管理器+栈式布局管理器
vLayout->addLayout(&sLayout);
vLayout->addLayout(hLayout);
setLayout(vLayout);
}
// 隐式指定了 当前四个标签的父组件是 QWidget 窗口1
QWidget* Widget::get1stPage()
{
//创建窗口1 和 网格布局管理器
QWidget* ret = new QWidget();
QGridLayout* layout = new QGridLayout();
//设置标签显示内容
fLbl1.setText("This");
fLbl2.setText("is");
fLbl3.setText("1st");
fLbl4.setText("page");
//将标签添加到 网格布局管理器
layout->addWidget(&fLbl1, 0, 0);
layout->addWidget(&fLbl2, 0, 1);
layout->addWidget(&fLbl3, 1, 0);
layout->addWidget(&fLbl4, 1, 1);
//将当前 网格布局管理器QGridLayout 设置到当前窗口QWidget,即QGridLayout生效
ret->setLayout(layout);
/*验证 四个标签的父组件地址*/
qDebug()<< ret;
qDebug()<< fLbl1.parent();
qDebug()<< fLbl2.parent();
qDebug()<< fLbl3.parent();
qDebug()<< fLbl3.parent();
return ret;//QWidget
}
//隐式指定了 当前文本输入框的父组件是 QWidget 窗口2
QWidget* Widget::get2ndPage()
{
//创建窗口2 和 表单布局管理器
QWidget* ret = new QWidget();
QFormLayout* layout = new QFormLayout();
sLineEdit.setText("This is 2rd page");//设置文本输入框 并设置输入框中显示内容
layout->addRow("Hint:", &sLineEdit);// 向 表单布局管理器 添加文本输入框组件 并指定标签
//将当前 表单布局管理器QFormLayout 设置到当前窗口QWidget,即QFormLayout生效
ret->setLayout(layout);
return ret;//QWidget
}
//隐式指定了 当前两个按钮的父组件是 QWidget 窗口3
QWidget* Widget::get3rdPage()
{
//创建窗口3 和 垂直布局管理器
QWidget* ret = new QWidget();
QVBoxLayout* layout = new QVBoxLayout();
//设置按键显示内容
tPushBtn1.setText("This is");
tPushBtn2.setText("3rd page");
//向垂直布局管理器 添加 tPushBtn1,tPushBtn2
layout->addWidget(&tPushBtn1);
layout->addWidget(&tPushBtn2);
//将当前 垂直布局管理器QVBoxLayout 设置到当前窗口QWidget,即QVBoxLayout生效
ret->setLayout(layout);
return ret;//QWidget
}
void Widget::onPreBtnClicked()
{
//currentIndex():获取当前显示的组件下标
//减1 得到上一个组件下标
int index = ((sLayout.currentIndex() - 1) + 3) % 3;
//设置当前显示的组件是哪一个,下标为index
sLayout.setCurrentIndex(index);
}
void Widget::onNextBtnClicked()
{
//currentIndex():获取当前显示的组件下标
//加1 得到下一个组件下标
int index = (sLayout.currentIndex() + 1) % 3;
//设置当前显示的组件是哪一个,下标为index
sLayout.setCurrentIndex(index);
}
Widget::~Widget()
{
}
main.cpp
#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}