绝对定位和布局定位
Qt 提供了两种组件定位机制:绝对定位和布局定位。
绝对定位
给出这个组件的绝对坐标以及长宽值。
带来问题: 如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。
所以另一个布局定位就是为了解决这个问题的
布局
你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。
以下是使用QHBoxLayout布局的代码
// !!! Qt 5
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox(&window);
QSlider *slider = new QSlider(Qt::Horizontal, &window);
spinBox->setRange(0, 130);
slider->setRange(0, 130);
QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
spinBox->setValue(35);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window.setLayout(layout);
window.show();
return app.exec();
}
注意以上:
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
因为valueChanged有重载
Q_SIGNALS:
void valueChanged(int);
void valueChanged(const QString &);
作为signal 会让编译器不知道使用哪一个故加了一步显示使用 void valueChanged(int);
解释代码:
QSpinBox就是只能输入数字的输入框,并且带有上下箭头的步进按钮。QSlider则是带有滑块的滑竿。我们可以从上面的截图中清楚地辨别出这两个组件。当我们创建了这两个组件的实例之后,我们使用setRange()函数设置其范围。既然我们的窗口标题是“Enter
your age(输入你的年龄)”,那么把 range(范围)设置为 0 到 130 应该足够了。
我们创建了一个QHBoxLayout对象。显然,这就是一个布局管理器。然后将这两个组件都添加到这个布局管理器,并且把该布局管理器设置为窗口的布局管理器。这些代码看起来都是顺理成章的,应该很容易明白。并且,布局管理器很聪明地做出了正确的行为:保持QSpinBox宽度不变,自动拉伸QSlider的宽度。
Qt 提供了几种布局管理器供我们选择:
QHBoxLayout:按照水平方向从左到右布局;
QVBoxLayout:按照竖直方向从上到下布局;
QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;
QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。
布局根据使用再作详细介绍
QHBoxLayout
在水平的方向上排列控件 左右排列 H代表horizontal 水平的
QVBoxLayout
QVBoxLayout:按照竖直方向从上到下布局, V代表vertical 垂直的
QGridLayout
在一个网格中进行布局,类似于 HTML 的 table;Grid网格意思
QFormLayout
按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
QStackedLayout
层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。