为你敲开 Qt 的大门

我们已经运行起了第一个 Qt 程序,现在来分析一下在 hello-qt 里面到底做了什么。

hello-qt 代码分析

首先回顾一下 main.cpp 的源码:

1
2
3
4
5
6
7
8
9
10
#include <QApplication>
#include <QLabel>
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label("Hello, Qt!");
    label.show();
    return app.exec();
}

在文件开头处,我们引入了两个头文件

1
2
#include <QApplication>
#include <QLabel>

由于我们编写的是 Qt 程序,所以首先引入 QApplication 头文件, QApplication 对象会为我们管理 Qt 的事件循环之类的任务。接着引入的是 QLabel 头文件,当前只要简单的理解 QLabel 是一个用于展示文本或图片的窗口部件就行了。

接着在 main 函数部分

6
7
8
    QApplication app(argc, argv);
    QLabel label("Hello, Qt!");
    label.show();

我们生成了一个 QApplication 对象 app,并把 main 函数的运行参数作为 QApplication 对象的初始化参数,这样我们就可以在运行程序的时候加上额外的运行参数,例如可以改变运行时的样式。随后生成了一个 QLabel 对象 label,在初始化时设定其文本内容为 “Hello, Qt!”,并调用 label 的 show() 方法,使其处于显示状态。

9
    return app.exec();

程序逻辑的最后部分,我们调用 app 的 exec() 方法,使程序进入 Qt 的事件循环,这时候 label 对象才会显示在图形窗口上,并且可以接受用户的键盘或鼠标操作。(当然,我们还没编写响应用户操作的函数呢。)

程序逻辑部分就分析到这里,此时的 cpp 源码并不能直接使用 C++ 编译器(例如 gcc)直接编译,因为编译器并不知道要到哪里链接 Qt 的库模块,这时候就要 qmake 出马。

qmake

在说 qmake 之前首先要认识 make[1],make 用于配置编译过程自动化。但是在项目中的源文件增多时,手工写 Makefile[2] 将会非常痛苦,于是人类又发明了制造工具的工具,而 qmake 就是一个用来生成 Makefile 的工具。

qmake 是 Qt 工具链中重要的一环,可用于配置 Qt 程序的编译规则,也可以配置非 Qt 程序的编译规则。更重要的是, qmake 还会设定 Qt 中必须的 moc 和 uic [3]的编译规则,同时 qmake 可以为不同的操作系统平台设置相应的编译规则。

我们编译 hello-qt 的时候用到了三条命令

1
qmake -project

这条命令为程序目录生成了一个配置文件,名为 hello-qt.pro。默认配置下,它的文件名是取决于文件夹的,这目前不是重点。如果有兴趣,可以打开 hello-qt.pro 看一下,这是一个纯文本。

现在我们只有一个 main.cpp 文件,就不需要知道 qmake 配置的细节了。当你的程序开始长大的时候再去阅读 qmake 的参数设置。

2
qmake

这条命令让 qmake 根据 hello-qt.pro 文件的内容生成 Makefile 文件。你也可以打开 Makefile 看一下——哇,太复杂了,好在有 qmake 帮我们处理了这些可怕的东西。

3
make

剩下的就是交给 make 来完成了,它会根据 Makefile 的内容来编译链接我们的 Qt 程序。

————————————
[1] 如果你没有用过 make ,可以到 http://zh.wikipedia.org/zh-cn/Make 看一下基本用法。
[2] Makefile 是 make 的规则文件。
[3] moc 和 uic 是 Qt 程序编译过程用到的工具,qmake 已经为我们隐藏了它们的使用细节,放心的交给 qmake 就行了。

§105 · By Rei · 09月 13, 2010 ·