《Qt5学习笔记4》QHBoxLayout和QVBoxLayout

可以任意分发转载,但请注明出处。

如有纰漏,请发送E-mail到[email protected]联系我,谢谢


窗口布局对于拥有界面的程序是非常重要,Qt 的界面布局非常的灵活,而且功能强大,其最主要的就是布局类了。

Qt中布局类的基类是一个叫做QLayout的虚基类,其有四个实体子类:QBoxLayout、QGridLayout、QFormLayout 和 QStackedLayout,而QBoxLayout又包含两个子类:QHBoxLayout(H表示horizontal) 和 QVBoxLayout(V表示vertical)。它们的关系图如下:



今天仅介绍水平布局QHBoxLayout和垂直布局QVBoxLayout。

先来看一个实例,代码如下:

#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
	// 创建主窗口并设置标题
    QWidget *window = new QWidget;
    window->setWindowTitle("Enter Your Age");
	// 创建一个SpinBox和一个水平Slider,并设置它们的范围为0-130
    QSpinBox *spinBox = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal);
    spinBox->setRange(0, 130);
    slider->setRange(0, 130);
	// 信号和槽的连接
    QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                     slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)),
                     spinBox, SLOT(setValue(int)));

    spinBox->setValue(18);	//设置SpinBox的初始值为18

    QHBoxLayout *layout = new QHBoxLayout;	//创建一个水平布局
    layout->addWidget(spinBox);			//将spinbox加入到布局layout
    layout->addWidget(slider);			//将slider加入到布局layout
    window->setLayout(layout);			//将窗口的布局设置为刚刚创建的这个布局

    window->show();
    return app.exec();
}

运行结果如图所示:


上面代码里面的注释已经讲的很清楚了,需要注意的是,函数addWidget()添加部件到布局layout的顺序决定了窗口上部件出现的顺序,如果把倒数6、7行代码交换顺序,运行后程序是这个样子的:


上面程序中使用QHBoxLayout定义了一个layout对象,如果将QHBoxLayout替换为QVBoxLayout,则效果图如下:


当然,在layout布局中,想添加多少控件就添加多少控件,当然要注意添加的顺序。

另外很重要的一点是,水平布局和垂直布局是可以嵌套的,来做个实例,把上面的代码改成如下代码:

#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>
#include <QPushButton>

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

    QWidget *window = new QWidget;
    window->setWindowTitle("Enter Your Age");

    QSpinBox *spinBox = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal);
    spinBox->setRange(0, 130);
    slider->setRange(0, 130);

    QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                     slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)),
                     spinBox, SLOT(setValue(int)));

    spinBox->setValue(18);

    //--------------------layout为水平布局--------------------------
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(spinBox);
    layout->addWidget(slider);

    //--------------------layout2垂直布局---------------------------
    QPushButton *button1 = new QPushButton("button1");
    QPushButton *button2 = new QPushButton("button2");
    QVBoxLayout *layout2 = new QVBoxLayout;
    layout2->addWidget(button1);
    layout2->addWidget(button2);

    //将layout和layout2放入layout3中,layout3为垂直布局
    QVBoxLayout *layout3 = new QVBoxLayout;
    layout3->addLayout(layout);
    layout3->addLayout(layout2);

    window->setLayout(layout3);     //将窗口布局设置为layout3
    window->show();
    return app.exec();
}

运行效果如下图所示:


需要知道的是,布局类会将子部件拉伸到适合的大小,如果不想子部件被拉伸,可以添加一个可拉伸的弹簧(或者叫占位符、分隔符),并用下面这三个函数设定部件的固定尺寸:

setFixedSize(int width, int height);    //设置固定尺寸
setFixedWidth(int width);                 //设置固定宽度
setFixedHeight(int height);               //设置固定高度

每个布局对象都有一个叫做addStretch()的方法,用于添加一个可以自动改变大小的弹簧。更改后的关于图中红色layout的代码如下:

    QSpinBox *spinBox = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal);
    spinBox->setRange(0, 130);
    spinBox->setFixedWidth(40);     //固定宽度
    slider->setRange(0, 130);
    slider->setFixedWidth(100);     //固定宽度

    QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                     slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)),
                     spinBox, SLOT(setValue(int)));

    spinBox->setValue(18);

    //--------------------layout为水平布局--------------------------
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(spinBox);
    layout->addWidget(slider);
    layout->addStretch();   //添加一个弹簧
运行结果如下:

《Qt5学习笔记4》QHBoxLayout和QVBoxLayout_第1张图片

现在我们知道,通过使用QHBoxlayout和QVBoxLayout的各种不同的嵌套组合,就可以设计出各种丰富的窗口布局。而这只是通过代码的方式来布局,如果通过Qt Creator集成开发环境中的Designer来布局,将会更加快速便捷,下次再说吧。


可以任意分发转载,但请注明出处。

如有纰漏,请发送E-mail到[email protected]联系我,谢谢


你可能感兴趣的:(qt5,QHBoxLayout,QBoxLayout,Qt5布局,QVBoxLayout)