我们已经运行起了第一个 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 就行了。
