可以任意分发转载,但请注明出处。
如有纰漏,请发送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); //设置固定高度
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(); //添加一个弹簧运行结果如下:
现在我们知道,通过使用QHBoxlayout和QVBoxLayout的各种不同的嵌套组合,就可以设计出各种丰富的窗口布局。而这只是通过代码的方式来布局,如果通过Qt Creator集成开发环境中的Designer来布局,将会更加快速便捷,下次再说吧。
可以任意分发转载,但请注明出处。
如有纰漏,请发送E-mail到[email protected]联系我,谢谢