窗口部件的布局,4窗口布局

By admin in 编程 on 2019年8月27日

1.4 窗口部件的布局,1.4窗口布局

Qt第一章的终极一个剧情是部件的布局。

书中的例子用到了二个QHBoxLayout类

其一类能够将停放在布局内的控件自动调度大小和职位,大家无需手动去调度,比较便利。

编程 1

第10行:创设多少个QWidget对象

QWidget是具备客户界面临象的基类。在此间将会用作任何部件的父对象,在那之上突显相应的控件。也正是说它将作为程序的主窗口。

第11行:设置窗口题目

字面意思上看也确确实实是安装窗口的题目。

第13行:创造一个QSpinBox对象

用到的函数:QSpinBox::QSpinBox ( QWidget * parent = 0
)

函数的印证:构造叁个微调框,暗中认可最小值为0,最大值值为99,起先值为0。

第14行:创造多个QSlider对象

用到的函数:QSlider::QSlider ( Qt::Orientation
orientation**, QWidget * parent = 0 )**

函数的验证:构造三个滑块,并钦命滑块方向,Qt::Vertical为垂直方向,Qt::Horizontal为水平方向。

第15~16行:设置有效限制

QSpinBox用到的函数:void QSpinBox::setRange ( intminimum**,
intmaximum
)**

QSlider用到的函数:void QAbstractSlider::setRange (
intmin**, intmax )**

函数的证实:设置微调框和滑块的有效限制,设置达成之后,在实际利用中是不会抢先这么些限制的,微调框本身手动输入一个不合法值也不会被符合规律输入,那也保障了数值的有用。

第18~21行:设置实信号和槽的接连

QSpinBox和QSlider都具有三个valueChanged(int)数字信号,证明当数值产生改换时会发射valueChanged复信号。

同时它们也都装有三个setValue(int)槽。

将QSpinBox的valueChanged实信号和QSlider的setValue槽连接之后,当QSpinBox的数值产生变动,QSlider的值也将进而改造。

同理,就足以知晓别的一个三番五次会生出的专门的学业了。

其余,这里或者有三个疑团:微调框的值爆发改造,它会调用滑块的setValue来设置滑块的值,这样一来滑块的值也发出变动,滑块也会调用微调框的setValue来设置微调框……如此频仍,仿佛认为那标准会现出死循环…?

也不掌握是还是不是本人初学的涉嫌,不清楚其余人会不会吗?笔者学到这里的时候就有这么些难题了。后来书中也解释过了,并不会冒出这种死循环的局面。

就此,必要通晓的是指标曾几何时会发出时域信号,它是有标准的。微调框发射valueChanged时限信号的尺码是:当数值已经转移

一经数值改换了,它会发出时限信号,由滑块响应并调用setValue槽来退换小编的值,那时它的值”改换了”,然则此间的更动只是”替换”成微调框新的值。

倘若那么些新的值与滑块原来已有的值是同一的,那就不叫更换了。所以滑块的值保持原样,并不相符数值已经退换那么些原则,不会再一次发射时域信号。

二个难题就那样解开了,它不会导致死循环。

第22行:设置QSpinBox的值

出于已经将实信号和槽进行接二连三了,所以在连续之后进展设置值的话,就能够发出时域信号,相应地会有槽在举行,把QSlider的值设置为和QSpinBox同样的数值。

第24行:成立叁个QHBoxLayout对象

用到的函数:QHBoxLayout::QHBoxLayout ()

函数的求证:成立一个水准布局管理器,管理各种控件地点和分寸。

第25~26行:将部件加多到水平布局对象中

用到的函数:void QBoxLayout::addWidget ( QWidget *
widget**, intstretch = 0, Qt::Alignmentalignment = 0 )**

函数的辨证:将部件增加到布局中,并调解布局内相继控件的大大小小与岗位。

第27行:在主窗口上设置布局管理器

用到的函数:void QWidget::setLayout ( QLayout * layout
)

函数的说明:设置布局管理器为那么些部件的布局。

 

终极自然正是将主窗口show()出来了

编程 2

无论如何调节窗口的增进率,微调框和滑块都会自行调节大小,的确是个很有利的东西。

 

接下去相比较详细讲的正是布局管理器了:

布局管理器正是一个可以对其所承担窗口部件的尺码大小和职位张开设置的对象。

Qt中有四个重要的布局管理器类:

    QHBoxLayout:在档案的次序方向上排列窗口部件,从左到右。头文件<QHBoxLayout>。

    QV博克斯Layout:在竖直方向上排列窗口部件,从上到下。头文件<QVBoxLayout>。

    QGridLayout:把各样窗口部件排列在四个网格中。头文件<QGridLayout>。

 

QHBoxLayout,水平布局管理器,正是那样子:

编程 3

编程 4

 

QVBoxLayout,竖直布局管理器,就是那样子:

编程 5

编程 6

 

QGridLayout,网格布局管理器,正是那样子:

编程 7

编程 8

用到的函数:void QGridLayout::addWidget ( QWidget *
widget**, introw, intcolumn, Qt::Alignmentalignment= 0 )**

函数的表明:widget钦赐要增加到布局管理器的对象。row和column为指标放置的职责。

QGridLayout将种种部件都助长到网格中,就如表格,能够内定部件放在表格的哪一行哪一列。这也是一致的。

 

 

这三种布局管理器能够嵌套,能够做出叁个很窘迫的布局。

组合C++的学识与事先所学过的Qt知识,作者来随意弄贰个分界面吧~

编程 9

 

#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QSlider>
#include <QSpinBox>
#include <QLabel>

#include <QLayout>
// 包含了<QLayout>就可以不用再包含以下3个头文件了
/*
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
*/

enum LAYOUT_TYPE
{
 layout_H, // QHBoxLayout
 layout_V, // QVBoxLayout
 layout_G // QGridLayout
};

QLayout * getLayout(LAYOUT_TYPE type);

int main(int argc, char * argv[])
{
 QApplication app(argc, argv);

 QWidget * window = new QWidget;
 window->setWindowTitle("Hello Qt!");


 /***************** 设置顶部菜单选项 ******************/
 QHBoxLayout * Top = (QHBoxLayout *)getLayout(layout_H);

 QPushButton * btn_Menu1 = new QPushButton("Start");
 QPushButton * btn_Menu2 = new QPushButton("Online");
 QPushButton * btn_Menu3 = new QPushButton("Setting");
 QPushButton * btn_Menu4 = new QPushButton("Exit");

 Top->addWidget(btn_Menu1);
 Top->addWidget(btn_Menu2);
 Top->addWidget(btn_Menu3);
 Top->addWidget(btn_Menu4);


 /***************** 设置中部左边部件 ******************/
 QVBoxLayout * midLeft = (QVBoxLayout *)getLayout(layout_V);

 QHBoxLayout * midLeftLayout1 = (QHBoxLayout *)getLayout(layout_H);
 QLabel * tip1 = new QLabel("Sound Volume");
 // 可以手动设置QSlider的方向,Horizontal是水平,Vertical是垂直
 QSlider * slider1 = new QSlider(Qt::Horizontal);
 slider1->setRange(0, 100);
 slider1->setValue(50);
 midLeftLayout1->addWidget(tip1);
 midLeftLayout1->addWidget(slider1);

 QHBoxLayout * midLeftLayout2 = (QHBoxLayout *)getLayout(layout_H);
 QLabel * tip2 = new QLabel("Sound Effect ");
 QSlider * slider2 = new QSlider(Qt::Horizontal);
 slider2->setRange(0, 100);
 slider2->setValue(50);
 midLeftLayout2->addWidget(tip2);
 midLeftLayout2->addWidget(slider2);

 midLeft->addLayout(midLeftLayout1);
 midLeft->addLayout(midLeftLayout2);

 /***************** 设置中部右边部件 ******************/
 QVBoxLayout * midRight = (QVBoxLayout *)getLayout(layout_V);

 QHBoxLayout * midRightLayout1 = (QHBoxLayout *)getLayout(layout_H);
 QLabel * tip3 = new QLabel("Game Levels");
 QSpinBox * spinBox = new QSpinBox();
 spinBox->setRange(1, 10);
 spinBox->setValue(1);
 midRightLayout1->addWidget(tip3);
 midRightLayout1->addWidget(spinBox);

 QHBoxLayout * midRightLayout2 = (QHBoxLayout *)getLayout(layout_H);
 QLabel * tip4 = new QLabel("Player Name");
 QLineEdit * Edit = new QLineEdit();
 midRightLayout2->addWidget(tip4);
 midRightLayout2->addWidget(Edit);

 midRight->addLayout(midRightLayout1);
 midRight->addLayout(midRightLayout2);


 // 将中部左右边的布局管理器添加到中部主布局管理器中
 QHBoxLayout * Mid = (QHBoxLayout *)getLayout(layout_H);
 Mid->addLayout(midLeft);
 Mid->addLayout(midRight);


 /***************** 设置底部部件 ******************/
 QHBoxLayout * Bottom = (QHBoxLayout *)getLayout(layout_H);

 QLabel * lab = new QLabel("All right reserved.");

 // addStretch()用于添加分隔符,用于占位
 // 就是已有的部件大小已确定为最佳的情况下,
 // 添加分隔符可以将多余的空位占用掉,以免部件调整自身大小以占用所有空位
 // 在lab的前后加上addStretch()可以使得lab居中哦~
 Bottom->addStretch();
 Bottom->addWidget(lab);
 Bottom->addStretch();

 /***************** 设置主布局管理器 ******************/
 QVBoxLayout * mainLayout = (QVBoxLayout *)getLayout(layout_V);
 mainLayout->addLayout(Top);
 mainLayout->addLayout(Mid);
 mainLayout->addLayout(Bottom);

 window->setLayout(mainLayout);
 window->show();

 return app.exec();
}

QLayout * getLayout(LAYOUT_TYPE type)
{
 QLayout * Layout;
 switch (type)
 {
 case layout_H:
  Layout = new QHBoxLayout;
  break;

 case layout_V:
  Layout = new QVBoxLayout;
  break;

 case layout_G:
  Layout = new QGridLayout;
  break;
 }
 return Layout;
}

 

 

行吗,就总结到那边~

 

窗口部件的布局,1.4窗口布局
Qt第一章的最终贰个剧情是部件的布局。 书中的例子用到了三个 QHBoxLayout 类
那一个类能够将放置在布局内的…

Qt第一章的最后一个内容是部件的布局。

Qt第一章的尾声二个剧情是部件的布局。

书中的例子用到了三个QHBoxLayout类

书中的例子用到了二个QHBoxLayout类

其一类能够将停放在布局内的控件自动调治大小和职位,大家没有需求手动去调度,相比便利。

本条类能够将停放在布局内的控件自动调治大小和岗位,我们无需手动去调解,相比便利。

编程 10

编程 10

第10行:创造多少个QWidget对象

第10行:成立三个QWidget对象

QWidget是持有客户界面临象的基类。在此地将会用作任何部件的父对象,在那之上显示相应的控件。也等于说它将用作程序的主窗口。

QWidget是具备客商界面前遭受象的基类。在此间将会用作任何部件的父对象,在那之上显示相应的控件。相当于说它将作为程序的主窗口。

第11行:设置窗口标题

第11行:设置窗口标题

字面意思上看也真便是安装窗口的标题。

字面意思上看也的确是设置窗口的题目。

第13行:创设二个QSpinBox对象

第13行:创造叁个QSpinBox对象

用到的函数:QSpinBox::QSpinBox (
QWidget * parent = 0 )

用到的函数:QSpinBox::QSpinBox (
QWidget * parent = 0 )

函数的求证:构造三个微调框,暗中同意最小值为0,最大值值为99,初始值为0。

函数的辨证:构造几个微调框,私下认可最小值为0,最大值值为99,初阶值为0。

第14行:创立贰个QSlider对象

第14行:成立四个QSlider对象

用到的函数:QSlider::QSlider ( Qt::Orientation
orientation**, QWidget * parent = 0 )**

用到的函数:QSlider::QSlider ( Qt::Orientation
orientation**, QWidget * parent = 0 )**

函数的表明:构造一个滑块,并钦点滑块方向,Qt::Vertical为垂直方向,Qt::Horizontal为水平方向。

函数的求证:构造四个滑块,并钦命滑块方向,Qt::Vertical为垂直方向,Qt::Horizontal为水平方向。

第15~16行:设置有效限制

第15~16行:设置有效限制

QSpin博克斯用到的函数:void
QSpinBox::setRange ( intminimum**, intmaximum )**

QSpinBox用到的函数:void
QSpinBox::setRange ( intminimum**, intmaximum )**

QSlider用到的函数:void
QAbstractSlider::setRange ( intmin**, intmax )**

QSlider用到的函数:void
QAbstractSlider::setRange ( intmin**, intmax )**

函数的认证:设置微调框和滑块的实用限制,设置达成现在,在其实使用中是不会超越这些界定的,微调框自身手动输入叁个违法值也不会被经常输入,那也准保了数值的有效性。

函数的认证:设置微调框和滑块的行之有效限制,设置落成现在,在骨子里运用中是不会超越那些限制的,微调框自身手动输入三个违规值也不会被符合规律输入,那也确定保证了数值的管事。

第18~21行:设置非数字信号和槽的连接

第18~21行:设置实信号和槽的连接

QSpinBox和QSlider都享有二个valueChanged(int)非功率信号,评释当数值发生转移时会发射valueChanged信号。

QSpinBox和QSlider都有着四个valueChanged(int)时限信号,注脚当数值发生退换时会发射valueChanged非实信号。

再正是它们也都负有二个setValue(int)槽。

相同的时候它们也都兼备一个setValue(int)槽。

将QSpin博克斯的valueChanged模拟信号和QSlider的setValue槽连接之后,当QSpinBox的数值产生变动,QSlider的值也将随之退换。

将QSpinBox的valueChanged功率信号和QSlider的setValue槽连接之后,当QSpinBox的数值发生转移,QSlider的值也将跟着退换。

同理,就足以清楚别的三个总是会发出的政工了。

同理,就能够清楚其他叁个总是会时有发生的事体了。

除此以外,这里大概有贰个难题:微调框的值爆发转移,它会调用滑块的setValue来设置滑块的值,那样一来滑块的值也发生更改,滑块也会调用微调框的setValue来设置微调框……如此反复,就像以为那样子会油不过生死循环…?

别的,这里只怕有贰个难点:微调框的值发生转移,它会调用滑块的setValue来设置滑块的值,那样一来滑块的值也发生改动,滑块也会调用微调框的setValue来设置微调框……如此再三,就如感觉那标准会现出死循环…?

也不领会是否自家初学的关系,不明白别的人会不会吗?小编学到这里的时候就有其一难题了。后来书中也解释过了,并不会冒出这种死循环的范畴。

也不理解是还是不是本身初学的涉及,不知道其余人会不会吗?作者学到这里的时候就有其一问号了。后来书中也解说过了,并不会冒出这种死循环的框框。

于是,须求精晓的是指标曾几何时会发出功率信号,它是有原则的。微调框发射valueChanged频域信号的规范是:当数值已经济体改成

为此,需求明白的是目的曾几何时会发出时限信号,它是有典型的。微调框发射valueChanged功率信号的法则是:当数值已经济体制改良成

万一数值更换了,它会发出时域信号,由滑块响应并调用setValue槽来改造本人的值,那时它的值”更改了”,但是此地的改造只是”替换”成微调框新的值。

假设数值退换了,它会发出非能量信号,由滑块响应并调用setValue槽来更换本人的值,那时它的值”更动了”,不过此间的退换只是”替换”成微调框新的值。

即使这几个新的值与滑块原本已有的值是大同小异的,那就不叫改造了。所以滑块的值保持原样,并不相符数值已经济体改成以此原则,不会再一次发出时域信号。

假若这几个新的值与滑块原来已有的值是同一的,那就不叫改变了。所以滑块的值保持原样,并不相符数值已经改造这一个准绳,不会再一次发出实信号。

贰个问号就那样解开了,它不会产生死循环。

一个可疑就疑似此解开了,它不会导致死循环。

第22行:设置QSpinBox的值

第22行:设置QSpinBox的值

出于已经将能量信号和槽进行连接了,所以在连接之后举办设置值的话,就能够发出信号,相应地会有槽在实行,把QSlider的值设置为和QSpinBox相同的数值。

由于已经将随机信号和槽举行连接了,所以在三番四次之后展开设置值的话,就能够发出信号,相应地会有槽在奉行,把QSlider的值设置为和QSpinBox一样的数值。

第24行:创造一个QH博克斯Layout对象

第24行:成立叁个QHBoxLayout对象

用到的函数:QHBoxLayout::QHBoxLayout
()

用到的函数:QHBoxLayout::QHBoxLayout
()

函数的认证:创设一个水准布局管理器,管理各种控件地点和大小。

函数的认证:创造一个等级次序布局管理器,管理各类控件位置和分寸。

第25~26行:将部件增添到水平布局对象中

第25~26行:将部件增多到水平布局对象中

用到的函数:void
QBoxLayout::addWidget ( QWidget * widget**,
intstretch
= 0, Qt::Alignmentalignment = 0 )**

用到的函数:void
QBoxLayout::addWidget ( QWidget * widget**,
intstretch
= 0, Qt::Alignmentalignment = 0 )**

函数的认证:将部件增多到布局中,并调度布局内家家户户控件的尺寸与地点。

函数的求证:将部件增多到布局中,并调解布局内种种控件的分寸与岗位。

第27行:在主窗口上设置布局管理器

第27行:在主窗口上设置布局管理器

用到的函数:void QWidget::setLayout
( QLayout * layout )

用到的函数:void QWidget::setLayout
( QLayout * layout )

函数的辨证:设置布局管理器为那几个部件的布局。

函数的印证:设置布局管理器为这些部件的布局。

 

 

终极自然正是将主窗口show()出来了

最后自然正是将主窗口show()出来了

编程 12

编程 12

无论怎么着调解窗口的大幅,微调框和滑块都会自动调度大小,的确是个很有益的事物。

无论怎么着调治窗口的上涨的幅度,微调框和滑块都会自行调节大小,的确是个很平价的事物。

 

 

接下去相比较详细讲的正是布局管理器了:

接下去相比较详细讲的就是布局处理器了:

布局管理器便是三个能够对其所担任窗口部件的尺码大小和地方展开安装的对象。

布局管理器就是叁个能够对其所承担窗口部件的尺码大小和岗位打开设置的对象。

Qt中有多个重视的布局管理器类:

Qt中有五个基本点的布局管理器类:

    QH博克斯Layout:在等级次序方向上排列窗口部件,从左到右。头文件<QHBoxLayout>。

    QHBoxLayout:在等级次序方向上排列窗口部件,从左到右。头文件<QHBoxLayout>。

    QVBoxLayout:在竖直方向上排列窗口部件,从上到下。头文件<QVBoxLayout>。

    QVBoxLayout:在竖直方向上排列窗口部件,从上到下。头文件<QVBoxLayout>。

    QGridLayout:把各种窗口部件排列在三个网格中。头文件<QGridLayout>。

    QGridLayout:把各样窗口部件排列在一个网格中。头文件<QGridLayout>。

 

 

QHBoxLayout,水平布局管理器,便是那样子:

QHBoxLayout,水平布局管理器,正是那样子:

编程 14

编程 14

编程 16

编程 16

 

 

QVBoxLayout,竖直布局管理器,正是那样子:

QVBoxLayout,竖直布局管理器,正是那样子:

编程 18

编程 18

编程 20

编程 20

 

 

QGridLayout,网格布局管理器,就是那样子:

QGridLayout,网格布局管理器,就是那样子:

编程 22

编程 22

编程 24

编程 24

用到的函数:void
QGridLayout::addWidget ( QWidget * widget**,
introw
, intcolumn, Qt::Alignment编程,alignment = 0 )**

用到的函数:void
QGridLayout::addWidget ( QWidget * widget**,
introw
, intcolumn, Qt::Alignmentalignment = 0 )**

函数的说明:widget内定要增加到布局管理器的对象。row和column为目的放置的职责。

函数的表明:widget钦赐要增多到布局管理器的靶子。row和column为目的放置的职位。

QGridLayout将次第部件都抬高到网格中,似乎表格,能够钦点部件放在表格的哪一行哪一列。那也是同一的。

QGridLayout将逐一部件都抬高到网格中,如同表格,能够内定部件放在表格的哪一行哪一列。那也是同一的。

 

 

 

 

那三种布局管理器能够嵌套,能够做出多少个很难堪的布局。

那三种布局管理器可以嵌套,能够做出七个很为难的布局。

组合C++的学问与事先所学过的Qt知识,小编来随意弄叁个分界面吧~

构成C++的学问与从前所学过的Qt知识,作者来随意弄叁个分界面吧~

编程 26

编程 26

 

 

#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QSlider>
#include <QSpinBox>
#include <QLabel>

#include <QLayout>
// 包含了<QLayout>就可以不用再包含以下3个头文件了
/*
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
*/

enum LAYOUT_TYPE
{
    layout_H,   // QHBoxLayout
    layout_V,   // QVBoxLayout
    layout_G    // QGridLayout
};

QLayout * getLayout(LAYOUT_TYPE type);

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    QWidget * window = new QWidget;
    window->setWindowTitle("Hello Qt!");


    /***************** 设置顶部菜单选项 ******************/
    QHBoxLayout * Top = (QHBoxLayout *)getLayout(layout_H);

    QPushButton * btn_Menu1 = new QPushButton("Start");
    QPushButton * btn_Menu2 = new QPushButton("Online");
    QPushButton * btn_Menu3 = new QPushButton("Setting");
    QPushButton * btn_Menu4 = new QPushButton("Exit");

    Top->addWidget(btn_Menu1);
    Top->addWidget(btn_Menu2);
    Top->addWidget(btn_Menu3);
    Top->addWidget(btn_Menu4);


    /***************** 设置中部左边部件 ******************/
    QVBoxLayout * midLeft = (QVBoxLayout *)getLayout(layout_V);

    QHBoxLayout * midLeftLayout1 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip1 = new QLabel("Sound Volume");
    // 可以手动设置QSlider的方向,Horizontal是水平,Vertical是垂直
    QSlider * slider1 = new QSlider(Qt::Horizontal);
    slider1->setRange(0, 100);
    slider1->setValue(50);
    midLeftLayout1->addWidget(tip1);
    midLeftLayout1->addWidget(slider1);

    QHBoxLayout * midLeftLayout2 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip2 = new QLabel("Sound Effect ");
    QSlider * slider2 = new QSlider(Qt::Horizontal);
    slider2->setRange(0, 100);
    slider2->setValue(50);
    midLeftLayout2->addWidget(tip2);
    midLeftLayout2->addWidget(slider2);

    midLeft->addLayout(midLeftLayout1);
    midLeft->addLayout(midLeftLayout2);

    /***************** 设置中部右边部件 ******************/
    QVBoxLayout * midRight = (QVBoxLayout *)getLayout(layout_V);

    QHBoxLayout * midRightLayout1 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip3 = new QLabel("Game Levels");
    QSpinBox * spinBox = new QSpinBox();
    spinBox->setRange(1, 10);
    spinBox->setValue(1);
    midRightLayout1->addWidget(tip3);
    midRightLayout1->addWidget(spinBox);

    QHBoxLayout * midRightLayout2 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip4 = new QLabel("Player Name");
    QLineEdit * Edit = new QLineEdit();
    midRightLayout2->addWidget(tip4);
    midRightLayout2->addWidget(Edit);

    midRight->addLayout(midRightLayout1);
    midRight->addLayout(midRightLayout2);


    // 将中部左右边的布局管理器添加到中部主布局管理器中
    QHBoxLayout * Mid = (QHBoxLayout *)getLayout(layout_H);
    Mid->addLayout(midLeft);
    Mid->addLayout(midRight);


    /***************** 设置底部部件 ******************/
    QHBoxLayout * Bottom = (QHBoxLayout *)getLayout(layout_H);

    QLabel * lab = new QLabel("All right reserved.");

    // addStretch()用于添加分隔符,用于占位
    // 就是已有的部件大小已确定为最佳的情况下,
    // 添加分隔符可以将多余的空位占用掉,以免部件调整自身大小以占用所有空位
    // 在lab的前后加上addStretch()可以使得lab居中哦~
    Bottom->addStretch();
    Bottom->addWidget(lab);
    Bottom->addStretch();

    /***************** 设置主布局管理器 ******************/
    QVBoxLayout * mainLayout = (QVBoxLayout *)getLayout(layout_V);
    mainLayout->addLayout(Top);
    mainLayout->addLayout(Mid);
    mainLayout->addLayout(Bottom);

    window->setLayout(mainLayout);
    window->show();

    return app.exec();
}

QLayout * getLayout(LAYOUT_TYPE type)
{
    QLayout * Layout;
    switch (type)
    {
    case layout_H:
        Layout = new QHBoxLayout;
        break;

    case layout_V:
        Layout = new QVBoxLayout;
        break;

    case layout_G:
        Layout = new QGridLayout;
        break;
    }
    return Layout;
}
#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
#include <QSlider>
#include <QSpinBox>
#include <QLabel>

#include <QLayout>
// 包含了<QLayout>就可以不用再包含以下3个头文件了
/*
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
*/

enum LAYOUT_TYPE
{
    layout_H,   // QHBoxLayout
    layout_V,   // QVBoxLayout
    layout_G    // QGridLayout
};

QLayout * getLayout(LAYOUT_TYPE type);

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    QWidget * window = new QWidget;
    window->setWindowTitle("Hello Qt!");


    /***************** 设置顶部菜单选项 ******************/
    QHBoxLayout * Top = (QHBoxLayout *)getLayout(layout_H);

    QPushButton * btn_Menu1 = new QPushButton("Start");
    QPushButton * btn_Menu2 = new QPushButton("Online");
    QPushButton * btn_Menu3 = new QPushButton("Setting");
    QPushButton * btn_Menu4 = new QPushButton("Exit");

    Top->addWidget(btn_Menu1);
    Top->addWidget(btn_Menu2);
    Top->addWidget(btn_Menu3);
    Top->addWidget(btn_Menu4);


    /***************** 设置中部左边部件 ******************/
    QVBoxLayout * midLeft = (QVBoxLayout *)getLayout(layout_V);

    QHBoxLayout * midLeftLayout1 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip1 = new QLabel("Sound Volume");
    // 可以手动设置QSlider的方向,Horizontal是水平,Vertical是垂直
    QSlider * slider1 = new QSlider(Qt::Horizontal);
    slider1->setRange(0, 100);
    slider1->setValue(50);
    midLeftLayout1->addWidget(tip1);
    midLeftLayout1->addWidget(slider1);

    QHBoxLayout * midLeftLayout2 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip2 = new QLabel("Sound Effect ");
    QSlider * slider2 = new QSlider(Qt::Horizontal);
    slider2->setRange(0, 100);
    slider2->setValue(50);
    midLeftLayout2->addWidget(tip2);
    midLeftLayout2->addWidget(slider2);

    midLeft->addLayout(midLeftLayout1);
    midLeft->addLayout(midLeftLayout2);

    /***************** 设置中部右边部件 ******************/
    QVBoxLayout * midRight = (QVBoxLayout *)getLayout(layout_V);

    QHBoxLayout * midRightLayout1 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip3 = new QLabel("Game Levels");
    QSpinBox * spinBox = new QSpinBox();
    spinBox->setRange(1, 10);
    spinBox->setValue(1);
    midRightLayout1->addWidget(tip3);
    midRightLayout1->addWidget(spinBox);

    QHBoxLayout * midRightLayout2 = (QHBoxLayout *)getLayout(layout_H);
    QLabel * tip4 = new QLabel("Player Name");
    QLineEdit * Edit = new QLineEdit();
    midRightLayout2->addWidget(tip4);
    midRightLayout2->addWidget(Edit);

    midRight->addLayout(midRightLayout1);
    midRight->addLayout(midRightLayout2);


    // 将中部左右边的布局管理器添加到中部主布局管理器中
    QHBoxLayout * Mid = (QHBoxLayout *)getLayout(layout_H);
    Mid->addLayout(midLeft);
    Mid->addLayout(midRight);


    /***************** 设置底部部件 ******************/
    QHBoxLayout * Bottom = (QHBoxLayout *)getLayout(layout_H);

    QLabel * lab = new QLabel("All right reserved.");

    // addStretch()用于添加分隔符,用于占位
    // 就是已有的部件大小已确定为最佳的情况下,
    // 添加分隔符可以将多余的空位占用掉,以免部件调整自身大小以占用所有空位
    // 在lab的前后加上addStretch()可以使得lab居中哦~
    Bottom->addStretch();
    Bottom->addWidget(lab);
    Bottom->addStretch();

    /***************** 设置主布局管理器 ******************/
    QVBoxLayout * mainLayout = (QVBoxLayout *)getLayout(layout_V);
    mainLayout->addLayout(Top);
    mainLayout->addLayout(Mid);
    mainLayout->addLayout(Bottom);

    window->setLayout(mainLayout);
    window->show();

    return app.exec();
}

QLayout * getLayout(LAYOUT_TYPE type)
{
    QLayout * Layout;
    switch (type)
    {
    case layout_H:
        Layout = new QHBoxLayout;
        break;

    case layout_V:
        Layout = new QVBoxLayout;
        break;

    case layout_G:
        Layout = new QGridLayout;
        break;
    }
    return Layout;
}

 

 

 

 

好啊,就计算到这里~

好啊,就计算到这里~

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有