1、布局管理器的综合实例------模拟向导用户界面(Windows平台)
-----练习开发一个向导用户界面
@1:在同一界面上展现不同的向导页面
@2:通过上一步和下一步按钮进行切换
@3:不同页面上的元素组件和这些组件排布都不相同
@4:页面中的组件通过布局管理进行排布
(1)通过布局嵌套进行界面设计
@1:上一步和下一步这两个按钮用水平布局管理器QHBoxLayout来进行管理,不同页面上的显示的内容只有按钮不变,所以讲不同页面的内容用栈式布局管理器QStackedLayout进行管理,这样
在切换不能页面的时候,就相当于切换栈式布局管理器中的栈顶组件。之后用垂直布局管理器QVBoxLayout将这个栈式布局管理器和水平布局管理器进行管理,就达到了目的要求了
@2:通过QStackedLayout栈式布局管理器管理不同的页面。每一个页面都是一个QWidget的组件,每一个Qwidget组件中的内容都是不一样的,每一个QWidget组件作为一个容器,这个容器
中都有一个布局管理器或多个布局管理器
2、注意事项:
(1)任意容器类的组件都可以指定布局管理器
(2)同一布局管理器中的组件拥有相同的父组件
(3)设置布局管理器的同时也隐式的指定了父子关系了
(4)组件间的父子关系是Qt中内存管理的重要方式
/************************************************************.h代码************************************************************************/
#ifndef _WIDGET_H_
#define _WIDGET_H_
#include
#include
#include
#include
#include
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
private:
QPushButton preButton;
QPushButton nextButton;
QLabel label1; //标签
QLabel label2;
QLabel label3;
QLabel label4;
QLineEdit LineEdit1;
QLineEdit LineEdit2;
QPushButton button1;
QPushButton button2;
QStackedLayout slayout; //定义一个栈式布局管理器,在类中定义以便后面的成员函数访问方便
void init(); //用来初始化构造界面的
QWidget *get_Frist_Widget(); //打造QStackedLayout栈式布局管理器的第1页面的函数
QWidget *get_Second_Widget(); //打造QStackedLayout栈式布局管理器的第2页面的函数
QWidget *get_Thrid_Widget(); //打造QStackedLayout栈式布局管理器的第3页面的函数
private slots:
void PreButtonClicked();
void NextButtonClicked();
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // _WIDGET_H_
/*******************************************************.cpp的代码*************************************************************************/
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent), preButton(this), nextButton(this)
{
init();
}
void Widget::init()
{
QVBoxLayout *vlayout = new QVBoxLayout(); //创建一个垂直布局管理器
QHBoxLayout *hlayout = new QHBoxLayout(); //创建一个水平布局管理器
preButton.setText("Pre Page");
preButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); //设置改按钮行为扩展,列为固定,有布局管理器时起作用
preButton.setMinimumSize(160, 30); //设置该按钮最小为160*30像素
nextButton.setText("Next Page");
nextButton.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); //设置改按钮行为扩展,列为固定,有布局管理器时起作用
nextButton.setMinimumSize(160, 30); //设置该按钮最小为160*30像素
connect(&preButton, SIGNAL(clicked()), this, SLOT(PreButtonClicked()));
connect(&nextButton, SIGNAL(clicked()), this, SLOT(NextButtonClicked()));
hlayout->addWidget(&preButton); //水平布局管理器管理按钮
hlayout->addWidget(&nextButton);
slayout.addWidget(get_Frist_Widget()); //将写好的不同QWiget组件页面添加到QStackedLayout栈式布局管理器中管理。 0
slayout.addWidget(get_Second_Widget()); // 1
slayout.addWidget(get_Thrid_Widget()); // 2
vlayout->addLayout(&slayout); //让这个垂直布局管理器管理这个水平布局管理器
vlayout->addLayout(hlayout); //让这个垂直布局管理器管理这个栈式布局管理器
slayout.setCurrentIndex(0); //设置当前栈式布局管理器中显示的组件是第1个
this->setLayout(vlayout); //设置当前窗口的布局管理器为vlayout这个垂直布局管理器
}
QWidget* Widget::get_Frist_Widget() //打造QStackedLayout栈式布局管理器的第1页面的函数
{
QWidget *ret = new QWidget();
QGridLayout *layout = new QGridLayout(); //网格管理形式的布局管理器
label1.setText("WuHengYi"); //设置标签的内容
label2.setText("FangQingQing");
label3.setText("I LOVE YOU");
label4.setText("Forever");
layout->addWidget(&label1, 0, 0); //设置标签在0,0这个格子的位置
layout->addWidget(&label2, 0, 1);
layout->addWidget(&label3, 1, 0);
layout->addWidget(&label4, 1, 1);
ret->setLayout(layout); //将要返回的这个QWidget容器组件中的布局管理器设置为layout
return ret;
}
QWidget* Widget::get_Second_Widget() //打造QStackedLayout栈式布局管理器的第2页面的函数
{
QWidget *ret = new QWidget();
QFormLayout *layout = new QFormLayout(); //表单形式的布局管理器
LineEdit1.setText("So care about you");
LineEdit2.setText("FangQingQing");
layout->addRow("who:", &LineEdit1); //设置表单,前面一个参数是标签,后面一个是编辑框,两者是相互对应的。不会随着窗口变,两者距离变
layout->addRow("Love to:", &LineEdit2);
ret->setLayout(layout); //将要返回的这个QWidget容器组件中的布局管理器设置为layout
return ret;
}
QWidget* Widget::get_Thrid_Widget() //打造QStackedLayout栈式布局管理器的第3页面的函数
{
QWidget *ret = new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
button1.setText("this is");
button2.setText("family");
layout->addWidget(&button1); //将按钮1添加到这个垂直布局管理器中
layout->addWidget(&button2);
ret->setLayout(layout);
return ret;
}
//点击这个按钮,到上一个页面(QStackedLayout布局管理器管理的组件)
void Widget::PreButtonClicked()
{
int index = ((slayout.currentIndex() - 1) + 3) % 3; //因为显示上一个页面,-1怕减多了,因为3个页面(QWidget),所以+3对3取余
slayout.setCurrentIndex(index); //显示上一个页面
}
void Widget::NextButtonClicked()
{
int index = (slayout.currentIndex() + 1) % 3; //因为显示下一个页面, 因为3个页面(QWidget),所以+1对3取余
slayout.setCurrentIndex(index); //显示下一个页面
}
Widget::~Widget()
{
}
/*****************************************************************main.cpp**************************************************************/
#include
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}