Qt布局管理器综合实例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt布局管理器综合实例相关的知识,希望对你有一定的参考价值。




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 <QtGui/QWidget>

#include <QPushButton>

#include <QVBoxLayout>

#include <QHBoxLayout>

#include <QStackedLayout>

#include <QLabel>

#include <QLineEdit>

#include <QFormLayout>


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 <QtGui/QApplication>

#include "widget.h"


int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    Widget w;

    w.show();

    

    return a.exec();

}





本文出自 “whylinux” 博客,谢绝转载!

以上是关于Qt布局管理器综合实例的主要内容,如果未能解决你的问题,请参考以下文章

QT开发(二十一)——QT布局管理器

11.QT-布局管理器(Box,Grid,Form,Stacked)

Qt布局管理器

Qt布局管理器(详解)

Qt之自定义布局管理器(QCardLayout)

Qt - 在窗口上安装布局管理器