第一章 开始(布局物件)

发布: 2008-05-29 22:22

布局物件


在这一部分,我们将创建一个小的应用程序实例示范如何用布局来管理物件在窗口中的几何形状和如何用信号与槽来同步两个物件。这个程序询问用户的年龄,用户可以通过操作一个(spin box) 或者一个(slider)来输入自己的年龄。


这个应用程序包含三个物件:一个 QSpinBox, 一个 QSlider,和一个 QWidget. QWidget 是该应用程序的主窗口。QSpinBox QSlider 被放置在QWidget中;它们是 QWidget 的孩子。或者,我们可以这么说 QWidget QSpinBox QSlider 的父亲QWidget 没有自己的父亲,因为它被用作一个顶级窗口。QWidget和它所有的子类的构造函数接受一个指向其父物件的 QWidget * 指针作为参数。


Figure 1.4. The Age application


 


下面是本程序的源代码:


 1 #include <QApplication>

 2 #include <QHBoxLayout>

 3 #include <QSlider>

 4 #include <QSpinBox>

 5 int main(int argc, char *argv[])

 6 {

 7     QApplication app(argc, argv);

 8     QWidget *window = new QWidget;

 9     window->setWindowTitle("Enter Your Age");

10     QSpinBox *spinBox = new QSpinBox;

11     QSlider *slider = new QSlider(Qt::Horizontal);

12     spinBox->setRange(0, 130);

13     slider->setRange(0, 130);

14     QObject::connect(spinBox, SIGNAL(valueChanged(int)),

15                      slider, SLOT(setValue(int)));

16     QObject::connect(slider, SIGNAL(valueChanged(int)),

17                      spinBox, SLOT(setValue(int)));

18     spinBox->setValue(35);

19     QHBoxLayout *layout = new QHBoxLayout;

20     layout->addWidget(spinBox);

21     layout->addWidget(slider);

22     window->setLayout(layout);

23     window->show();

24     return app.exec();

25 }

 


8和第9行创建一个 QWidget 作为这个应用程序的主窗口。我们调用setWindowTitle() 方法来设置要在窗口的标题栏中显示的文本。


10 11 行创建一个 QSpinBox 和一个 QSlider 物件, 12 13 设置了它们的有效范围。我们可以安全地假设用户最大有130岁。我们可以传递窗口(window)参数给 QSpinBox QSlider 的构造函数,明确的指定这些物件以窗口(window)作为它们的父亲,但这不是必需的,因为布局系统将自行指定这些并且自动设置(spin box)(slider)的父亲,很快我们就会看到这一点。


1417中的两个 QObject::connect() 调用确保了(spin box) (slider)是同步的,所以它们总是显示相同的数值。每当一个物件的数值改变时,它的 valueChanged(int) 信号将发出,而另一物件的 setValue(int) 槽将用这个新的数值作为参数被调用。


18 设置(spin box)的值为35。当这个改变发生时,QSpinBox 物件就会发出 valueChanged(int) 以整数35为参数值的信号。这个参数被传递给 QSlider 的 setValue(int) 槽,设置(slider)的值为35。然后,(slider)发出valueChanged(int) 信号,因为它的值改变了,触发(spin box)setValue(int) 但是在这个时候,setValue(int) 不发出任何信号,因为(spin box)的值已经是35了。这样就预防了无限制的循环 1.5总结了这个过程。


1.5. Changing one widget's value changes both


 


1922行,我们用一个布局管理器布局了 spin box slider 物件。一个布局管理器是一个设置在它的责任范围内的物件的大小和位置的对象。Qt 有三个主要的布局管理器类:


·         QHBoxLayout 用于从左至右水平布局物件(对于有的文化背景是从右至左)


·         QVBoxLayout 用于从上至下垂直布局物件。


·         QGridLayout 在网格中布局。


22行调用 QWidget::setLayout() 在窗口中安装布局管理器。在幕后,QSpinBox QSlider 被重新布局为已经安装了布局管理器的 QWidget 的子类,基于这个原因当我们构建一个物件用来放置一个布局管理器时我们不需要具体指定一个显式的父类。


1.6. The Age application's widgets


 


尽管我们没有明确地设置任何物件的位置和大小,QSpinBox QSlider 并排地呈现出恰当的布局。这是因为 QHBox-Layout 按照它们的需求自动为它所管理的物件设置了一个合理的位置和大小。布局管理器将我们从应用程序繁杂的屏幕位置编码中释放出来并确保窗口可以平滑的改变大小。


Qt 构造用户接口的方式容易理解并且非常有弹性。Qt 程序员最常用的模式是实例化需要的物件,然后设置它们必需的属性。程序员向布局中添加物件,布局将自动管理这些物件的大小和位置。用户接口的行为将被 Qt 用信号与槽的机制连接在一起。



原文: http://qtchina.tk/?q=node/90

Powered by zexport