概述:
所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以 便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。
Qt 提供了两种组件定位机制:绝对定位和布局定位。
绝对定位:绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗 口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。如 果你需要让组件自动更新——这是很常见的需求,比如在最大化时,Word 总会把稿纸区放大,把工具栏拉长——就要自己编写相应的函数来响应这些变化。或者,还有更简单的方法:禁止用户改 变窗口大小。但这总不是长远之计。
布局定位:你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应 的布局管理器进行调整。
1,使用滑竿和输入框双向数据绑定
比如使用两个组件,QSpinBox
和QSlider
来实现相互改变值
QSpinBox *spin = new QSpinBox(this);
QSlider *slider = new QSlider(Qt::Horizontal,this);//水平放置一个滑竿
/*设置变化范围为0-100*/
spin->setRange(0, 100);
slider->setRange(0, 100);
/*连接信号*/
connect(slider,&QSlider::valueChanged,spin,&QSpinBox::setValue);
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
connect(spin,spinBoxSignal,slider,&QSlider::setValue);
spin->setValue(18);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spin);
layout->addWidget(slider);
this->setLayout(layout);
执行结果如下
对于有布局的组件改变窗口的大小是不影响它的相对位置的;
注意:
低于双向数据绑定的时候由于函数valueChanged(int i)
是重载函数所以要显示指定或者强制转换避免编译错误。
2,Qt提供的布局管理器
<1>水平布局
QHBoxLayout //按照水平方向从左到右布局;
<2>垂直布局
QVBoxLayout:按照竖直方向从上到下布局;
<3>网格布局
QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;
<4>
QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
<5>
QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。