分类: LINUX
2011-04-16 00:15:38
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, 150);
13 slider->setRange(0, 150);
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 行建立程序的主窗口控件,设置标题。第 10 到 13 行创建主窗口的 children,并设置允许值的范围。第 14 到第 17 行是 spinBox 和 slider 的连接,以使之同步显示同一个年龄值。 不管那个控件的值发生变化,都会发出 valueChanged(int)信号,另一个控件的 setValue(int) 函数就会为这个控件设置一个新值。
第 18 行将 spinBox 的值设置为 35,这时 spinBox 发出 valueChanged(int)信号,int 的参 数值为 35,这个参数传递给 slider 的 setValue(int)函数,将 slider 的值也设置为 35。同理, slider 也会发出 valueChanged(int)信号,触发 spinBox 的 setValue(int)函数。这个时候, 因为 spinBox 的当前值就是 35,所以 spinBox 不会发送任何信号,不会引起死循环。
在第 19 至 22 行,我们使用了一个布局管理器排列 spinBox 和 slider 控件。布局管理器能够 根据需要确定控件的大小和位置。Qt 有三个主要的布局管理器: QHBoxLayout:水平排列控件。
QVBoxLayout:垂直排列控件。
QGridLayout:按矩阵方式排列控件
第 22 行,QWidget::setLayout()把这个布局管理器放在 window 上。这个语句将 spinBox
和 slider 的“父”设为 window,即布局管理器所在的控件。如果一个控件由布局管理器确定它 的大小和位置,那个创建它的时候就不必指定一个明确的“父”控件。
现在,虽然我们还没有看见 spinBox 和 slider 控件的大小和位置,它们已经水平排列好了。 QHBoxLayout 能合理安排它们。我们不用在程序中考虑控件在屏幕上的大小和位置这些头疼的事情了,交给布局管理器就万事大吉。
在 Qt 中建立用户界面就是这样简单灵活。程序员的任务就是实例化所需要的控件,按照需要设置它们的属性,把它们放到布局管理器中。界面中要完成任务由 Qt 的 signal 和 slot 完成。