当前位置:天才代写 > tutorial > C语言/C++ 教程 > Qt进修之路(5):组件机关

Qt进修之路(5):组件机关

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:273

副标题#e#

顾名思义,绝对定位就是利用最原始的定位要领,给出这个组件的坐标和长宽值。这样,Qt就知道该把组件放在那边,以及怎么配置组件的巨细了。可是这样做的一个问题是,假如用户改变了窗口巨细,好比点击了最大化可能拖动窗口边沿,这时,你就要本身编写相应的函数来响应这些变革,以制止那些组件还只是悄悄地呆在一个角落。可能,更简朴的要领是直接克制用户改变巨细。

不外,Qt提供了别的的一种机制,就是机关,来办理这个问题。你只要把组件放入某一种机关之中,当需要调解巨细可能位置的时候,Qt就知道该奈何举办调解。这雷同于Swing的机关打点器,不外Qt的机关没有那么多,只有有限的几个。

来看一下下面的例子:

#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QSpinBox>
#include <QtGui/QSlider>
#include <QtGui/QHBoxLayout>

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(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
spinBox->setValue(35);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);

window->show();

return app.exec();
}

这里利用了两个新的组件:QSpinBox和QSlider,以及一个新的顶级窗口QWidget。QSpinBox是一个有上下箭头的微调器,QSlider是一个滑动杆,只要运行一下就会大白到底是什么对象了。

代码并不是那么难解,照旧来简朴的看一下。首先建设了一个QWidget的实例,挪用setWindowTitle函数来配置窗口标题。然后建设了一个QSpinBox和QSlider,别离配置了它们值的范畴,利用的是setRange函数。然后举办信号槽的链接。这点后头再具体说明。然后是一个QHBoxLayout,就是一个程度机关,凭据从左到右的顺序举办添加,利用addWidget添加好组件后,挪用QWidget的 setLayout把QWidget的layout配置为我们界说的这个Layout,这样,措施就完成了!

编译运行一下,可以看到结果:

Qt学习之路(5):组件构造

假如最大化的话:

Qt学习之路(5):组件构造


#p#副标题#e#

固然我并没有添加任何代码,可是谁人layout就已经大白该奈何举办机关。

或者你发明,那两个信号槽的链接操纵会不会发生无限递归?因为steValue就会激发valueChanged信号!谜底是不会。这两句语句实现了,当spinBox发出valueChanged信号的时候,会回调slider的setValue,以更新slider的值;而slider发出 valueChanged信号的时候,又会回调slider的setValue。可是,假如新的value和旧的value是一样的话,是不会发出这个信号的,因此制止了无限递归。

模糊了吧?举个例子看。好比下面的spinBox->setValue(35)执行的时候,首先,spinBox会将本身的值设为35,这样,它的值与本来的纷歧样了(在没有setValue之前的时候,默认值是0),于是它发出了valueChanged信号。slider吸收到这个信号,于是回调本身的setValue函数,将它的值也配置成35,它也发出了valueChanged信号。虽然,此时spinBox又收到了,不外它发明,这个35和它自己的值是一样的,于是它就不发出信号,所以信号通报就遏制了。

那么,你会问,它们是怎么知道值的呢?谜底很简朴,因为你的信号和槽都接管了一个int参数!新的值就是通过这个举办通报的。实际上,我们操作Qt的信号槽机制完成了一个数据绑定,使两个组件可能更多组件的状态可以或许同步变革。

Qt一共有三种主要的layout,别离是:

QHBoxLayout- 凭据程度偏向从左到右机关;

QVBoxLayout- 凭据竖直偏向从上到下机关;

QGridLayout- 在一个网格中举办机关,雷同于HTML的table。

layout利用addWidget添加组件,利用addLayout可以添加子机关,因此,这就有了无穷无尽的组合方法。

我是在Windows上面举办编译的,假如你要是在其他平台上面,应用措施就会有差异的样子:

Qt学习之路(5):组件构造

还记得前面曾经说过,Qt不是利用的原生组件,而是本身绘制模仿的当地组件的样子,不外看看这个截图,它模仿的不能说百分百一致,也可说是惟妙惟肖了… 🙂

出处: http://devbean.blog.51cto.com/448512/194616

 

    关键字:

天才代写-代写联系方式