第二讲 窗口部件的布局与通信

本文概要:通过一个简单的例子,讲解如何通过布局(layout)来管理程序窗口中的窗口部件的几何形状,

             以及如何通过信号和槽来同步窗口部件。

 

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

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

    QWidget *window = new QWidget;
    QSpinBox *spinBox = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal);
    QLayout *layout = new QHBoxLayout;

    window->setWindowTitle("Enter Your Age");
    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(20);

    layout->addWidget(spinBox);
    layout->addWidget(slider);
    window->setLayout(layout);

    window->show();

    return app.exec();
}

 

运行效果如图:


布局管理器(layout manager):

  • 概念:布局管理器是一个能够对其所包含的窗口部件的位置以及大小进行设置的对象。
  • Qt中含有三个布局管理器类
    • QHBoxLayout:在水平方向上排列窗口部件,根据加入窗口管理器对象的窗口部件的顺序从左到右排列
    • QVBoxLayout:在垂直方向上排列窗口部件,根据加入窗口管理器对象的窗口部件的顺序从上到下排列
    • QGridLayout:把各个部件排列在一个网格中

 

布局管理器对其管理的窗口部件的大小与位置设置:

在Qt中,当窗口部件添加入布局管理器对象后,无须明确地设置任何一个窗口部件的位置或大小;布局管理器会自动根据其所负责的窗口部件的需要来为它们分配所需的位置和大小,并且,它还能保证在窗口尺寸大小发生改变时的平稳性。并且,布局管理器既可以添加多个窗口部件,也可以添加其他布局。

 

窗口部件的组合方式:

上述代码创建了spinBox, slider, window3个窗口部件(QSpinBox、QSlider等类都派生与QWidget类,QLayout派生自QObject类),这些窗口部件相互组合并且都包含在主窗口window中。首先,通过将spinBox、slider窗口部件添加到layout对象中,layout对象会自动对spinBox与slider窗口部件的位置以及大小进行设置,它们形成一个窗口部件的布局;然后,添加layout对象到window窗口部件中,则window窗口部件就包含了spinBox与slider窗口部件。通常,在Qt中,程序员通过先声明所需要的窗口部件,并且设置它们的属性,再通过布局管理器对这些窗口部件的位置与大小进行自动的设置进行窗口部件的组合。

 

窗口部件的父子关系:

在Qt中,在窗口部件创建时,可以通过构造函数为每个窗口部件都指定其父窗口部件。但是,在Qt中,当一个或者多个窗口部件被添加到一个布局管理器对象时,这些窗口部件的父对象自动设置为该布局管理器对象,而当该布局管理器对象被安装到其他窗口部件时(通过setLayout函数),布局管理器对象会自动成为该窗口部件的子对象。

 

窗口部件间的消息机制与同步机制(以代码为例):

在该代码中,若spinBox或者slider中任何一方的值发生改变,就会发出valueChange(int)信号给相应的槽。另一个对象就会自动用这个新的值调用它的setValue(int)

槽。在该代码中,spinBox设置它的值为20,发送信号被slider的setValue(int)槽接受,并调用slider的setValue(int)槽重新设置值value;但是在此时,slider

的value值改变,又会发送信号valueChange(int)。但是,在Qt中,spinBox会将值value与发送的信号中的值对比,若值相同,spinBox就不会重新设置它的值value,

避免了无限循环的发生,这样spinBox与slider就能保持同步。

总结:

      在Qt中,程序可以通过布局管理器来控制窗口部件的大小与位置以及它们的父子关系。通过Qt的信号与槽机制,窗口部件间能够实现通信并进行同步。

原文地址:https://www.cnblogs.com/tallisHe/p/4417067.html