初步学习内容:
1.1从Hello Qt开始
hello.cpp源码
1 #include <QApplication>
2 #include <QLabel>
3 int main(int argc, char *argv[])
4 {
5 QApplication app(argc, argv);
6 QLabel *label = new QLabel("Hello Qt!");
7 label->show();
8 return app.exec();
9 }
按行解析以上9行代码
第一,二行:是代码中需要使用的类的头文件。在Qt4中,可以写成<QApplication>的格式,当然也可写成“QApplication.h”。
第三行:是main函数的标准写法
第五行:创建一个QApplication对象,管理应用程序的资源。
第六行:QLabel对象,QLabel是一个Qt提供的小控件,显示一行文本。
第七行:显示QLabel。
第八行:QApplication.exec(),让程序进入消息循环。等待可能的菜单,工具条,鼠标等的输入,进行响应。
1.2连接信号和响应函数
这个例子用来说明怎么响应信号,和hello程序的源代码相似,原来的Label用一个按钮代替,点击时退出程序。
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit()));
button->show();
return app.exec();
}
当有所动作或者状态改变,qt的控件会发出消息(signal),例如,当点击按钮时,按钮会发送clicked()消息,这个消息可以连接到一个函数上(这个函数在这里成为slot)。这样,当一个消息发送时,slot函数可以自动执行。在这个例子中,我们连接了按钮的clicked信号和QApplication的quit函数。
1.3 控件几何排列
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行建立程序的主窗口控件,设置标题。第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完成。