Qt是一个跨平台应用程序和 UI 开发框架。使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt 提供了几个工具软件:
其中 snapshots 里面包含了最新测试版本; official releases 里面包含了官方发布版,即最终发布版; archive 里面是 Qt 4.7 及以前版本,Qt Creator 2.5 及以前版本。
1 | $ pacman -S qt4 |
1 | $ pacman -S qt5-tools |
1 | $ mkdir HelloWorld |
1 | $ cd HelloWorld |
1 |
|
1 | $ qmake -project |
1 | $ qmake |
1 | $ make |
与上面的步骤基本相同。但要在第4步生成 HelloWorld.pro 工程文件后往里添加一句话。
第4步调用 qmake -project
命令后生成的 HelloWorld.pro 内容如下:
1 | TEMPLATE = app |
将内容修改为:
1 | TEMPLATE = app |
其余步骤完全相同。
标准 C++ 对象模型在运行时效率方面卓有成效,但是在某些特定问题域下的静态特性就显得捉襟见肘。GUI 界面需要同时具有运行时的效率以及更高级别的灵活性。为了解决这一问题,Qt “扩展”了标准 C++。所谓“扩展”,实际是在使用标准 C++ 编译器编译 Qt 源程序之前,Qt 先使用一个叫做 moc(Meta Object Compiler,元对象编译器)的工具,先对 Qt 源代码进行一次预处理(注意,这个预处理与标准 C++ 的预处理有所不同。Qt 的 moc 预处理发生在标准 C++ 预处理器工作之前,并且 Qt 的 moc 预处理不是递归的。),生成标准 C++ 源代码,然后再使用标准 C++ 编译器进行编译。
Qt 使用 moc,为标准 C++ 增加了一些特性:
通过继承 QObject 类,我们可以很方便地获得这些特性。当然,这些特性都是由 moc 帮助我们实现的。moc 其实实现的是一个叫做元对象系统(meta-object system)的机制。正如上面所说,这是一个标准 C++ 的扩展,使得标准 C++ 更适合于进行 GUI 编程。虽然利用模板可以达到类似的效果,但是 Qt 没有选择使用模板。按照 Qt 官方的说法,模板虽然是内置语言特性,但是其语法实在是复杂,并且由于 GUI 是动态的,利用静态的模板机制有时候很难处理。而自己使用 moc 生成代码更为灵活,虽然效率有些降低(一个信号槽的调用大约相当于四个模板函数调用),不过在现代计算机上,这点性能损耗实在是可以忽略。