全部博文(584)
分类: WINDOWS
2011-05-12 10:53:40
Qt Creator 是 Qt 官方的 IDE ,这个 IDE 为 Qt 编程人员提供了一个完整的开发环境。当然了,这个 IDE 是用 Qt 写的,也是免费的。这个 IDE 真正的编译部分使用了 MinGW gcc compiler 。也就是说,这个 IDE 主要的作用是协助开发人员编写代码,并以更加友好的图形界面方式(而不是命令行)使用 MinGW 。下面我以 MS Visual Studio 作为参照,讲一些在 Windows 平台上 Qt Creator 的使用体会与小技巧。
1. 工程文件与项目组织结构
VC6 之前都是使用 dsw 文件(之后是 sln )来管理软件工程的(新版的 VC 提供 dsw 转换工具),每个 dsw 中可以有很多 dsp ,即项目文件。每个 dsp 中都可以包含任意多的 .h.cpp.rc 文件,每个 dsp 都可以单独编译。可以编译成 exe 或 dll 或 ocx 等等。一个 dsw 中的所有 dsp 也可以一起编译,而且各个 dsp 之间可以设定依存关系。比如一个 dsp 叫 baseui ,一个叫 myapp 。其中 baseui 将编译成为 baseui.dll ,而 myapp 将编译成为 myapp.exe 。在 myapp 中需要用到 baseui 中的某个类或某个资源或某个函数,那么 myapp 的依存关系中就需要有 baseui 。设定好依存关系后,每次整体编译之前, baseui 就会先于 myapp 编译,从而保证 myapp 需要的 lib 在编译之前就已经具备。
在 Qt Creator 中,项目的组织文件是 pro 类型,它并不具备 dsw, dsp 那样的 2 级结构。它跟 dsw 或 dsp 文件一样,也是机器生成的文本文件。不过在 Qt Creator 中,你可能经常需要手动去编辑这个文件。下面是一个简单的 pro 文件:
TARGET = Test112
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
第 1 行“ TARGET ”定义了目标文件的名称;
第 2 行“ TEMPLATE ”定义了目标文件的类型, app 即可执行文件。 Lib 是库文件(可以使 dll ,也可以使使用静态链接的库或是 plugin );
“ SOURCES ”里定义了所有的 cpp 文件;
“ HEADERS ”里定义了所有的 h 文件;
“ FORMS ”里定义了所有的 ui 文件(可以在 Qt Creator 中进行可视化编辑的界面类);
这里多说一下, ui 文件经过 qmake 之后会生成 ui_ 开头的一个 .h 文件,里面由程序自动生成一个新的 UI 类,类里面把可视化编辑的界面元素都用代码写出来。在 ui 文件对应的类中,这个自动生成的 ui 类会被 new 一个新的实例,用于协助开发人员。
不知道我说明白了没有,就是 ui 文件会帮助开发人员生成一些界面相关的代码,然而这些代码是以另一个新的类的成员变量及代码的形式被用于原来那个界面类的。(汗啊,我都说累了)我一直不明白为什么 Qt Creator 不像 VC 那样直接去修改原有类的代码。难道这个实现起来很困难吗?我打开 .ui 文件看过,它其实是界面的一个 xml 文件描述。忘记在哪里看到这种实现有一个优点就是如果程序界面部分写的足够灵活的话,程序升级时如果只涉及到界面,那么可以只下载这个 ui 文件进行升级即可。这个特性可能会让那些 saas 软件开发人员欣喜若狂。但对于大部分 desktop app 开发人员来说,还是有点让人迷惑。好在 Qt 中有 signal/slot 可用于 widget 与界面类(如 dialog )之间传递消息,否则这种中间加一层“假父类”的实现方式是在是让人难以接受。
Pro 文件说了这么多,足以说明 Qt Creator 在项目管理与设置上并不是特别友好。与 VC (甚至 VC6 )相比都有较大差距。编辑 pro 文件使我想起了 N 年前使用命令行方式编写 turbo C 程序。呵呵,可能开源软件就是这个范儿?
关于 pro 文件,还有很多内容需要开发人员去了解。我会专门写个 tip 。
2. IDE 界面
VC 的界面很经典,多年未发生根本性的改变(但相信很多老 VCer 对 VC6 以后的版本取消 Class Wizard 仍然耿耿于怀)。
Qt Creator 界面比较一般。硬伤是没有类树( Class Tree ) ,这个对于 OOP 来说非常的不便。由于没有类树,开发人员便不能对类进行相关的编码,这就意味着增加一个 member function 需要在该类的 .h 和 .cpp 文件中手工输入两次函数名称。同时,重载函数时也需比在 VC 中付出更多的时间。虽然增加一个函数的时间可能只增加 5-10 秒,但对于刚刚灵感闪现的程序员来说,可能会比较有挫折感。希望后面的版本能够加上。
代码输入界面 Qt Creator 做得不错,语法着色(不光有标准 C++ 的着色,还有 Qt 特有关键字的着色,如 SLOT 等)和类似 VC 的 intellisense 功能(代码自动完成)让人感觉很舒服。我记得前段时间看 VC Team 的 BLOG 还有人留言说 intellisense 很多问题。在我使用 Qt Creator 的这两个月时间里,还没发现 bug 。但是我一直觉得 Visual Assist 的功能做的最专业。使用 VA 的同学请举手。
3. 编译
在编译速度上, VC 全胜。快得不只一点点。当然 qmake 本身会多占用一些时间,但还是能明显感觉到 VC 快很多。
在编译代码质量上,我是门外汉,不敢妄下结论。但我感觉 Qt 生成的 exe 文件会更大一些,不知是不是为性能做的牺牲。所以 TX 门写代码时,千万不要图省事,把整个 Qt 模块(如 QtGUI )都 include 进来。
4. Debug
不得不说,又是 VC 赢了。 Qt Creator 不但速度慢,还经常有些莫名其妙的问题。你可能会被要求重新 build Debugging Helper 。还可能会出现 gdb crash 。
5. 帮助
MSDN 就不多说了。 Qt 专门有个 Qt Assist 程序用于提供所有帮助。 Qt Creator 中本身也有一个 help 模块。在网络上, Qt central 提供 forum 和 wiki 。但是,如果编程中遇到问题,那么你就会发现,使用 Qt 的人比起使用 VC 的人来少太多了。可能 VC 中的一些小问题别人早就碰到并在网上公布解决方案了。而 Qt 中你碰到的问题,可能在网上很难找到答案。使用 Qt 的 TX 们,大家还要努力丰富开源社区。
6. 如何选择
如果你只是使用 Qt 在 Windows 上开发,可以选择 VC2008 。 Express 版本也是免费的。
如果你是要开发 Cross-platform 的程序,还是应该选择 Qt Creator 。因为它在 Windows, Linux 和 Mac 上都可以运行( MinGW 也是 Cross-platform 的)。所以从平台移植和维护上考虑,可能 Qt Creator 是个更好的选择。另外,我个人的经历是,从 VC6 用到 2008 ,经常会碰到 VC 莫名其妙的退出,有时代码还未保存。而在使用 Qt Creator 的这段时间里,这种情况从未发生。相信这也从侧面证明了 Qt 本身是很健壮的。
一些使用 Qt Creator 的 tip
1. 使用 network 或 opengl 或 sql 等模块后编译不通过
在 pro 文件中写如下语句: QT += network 或 QT += opengl 或 QT += sql
2. 代码自动完成功能区分大小写
在 Tools->Options 菜单中的 Text Editor->Completion 中,勾掉“ Case-sensitive completion ”,这样就不会因为你大小写错了而使整个 completion 都消失掉。
3. Debug 时提示没有 debug helper
如下图,在 Options 菜单中红圈的位置点击 Rebuild 。
4. Qrc 中增加了图片,但是在程序中用不了
Qrc 文件中可以增加 Qt 程序使用的资源文件。这些文件会被编译到 exe 文件中。增加资源时需要先增加前缀 prefix 。看看你的 prefix 写的对不对。如果前缀是“ / ”那么一个典型的图片文件路径可能是“ :/Resources/Images/aaa.png ”。另外,在 qrc 中,文件名和路径名是 区分大小写的 。我曾经在这里卡了好几个小时,最后都怀疑 Qt Creator 是不是“水货”了。
5. Qt Creator 在 Windows 系统中,怎样链接 VC 生成的动态链接库
这个问题曾经困扰了我一整天。我想的是按照 VC 中的方法,增加 include 文件,增加 lib 文件,然后编译即可。谁知链接时总是出现问题。提示是 undefined reference to XXXXX 。查了手册和网络,原来这是 mingw 用户在 windows 上经常遇到的问题,而且好像至今没有完美的解决方案。这个错误的起因是因为 VC 生成 lib 的 _stdcall 函数名与 mingw 生成的不一致。一种解决方案是使用 libdll 等工具生成新的用于 mingw 的 lib ,另一种解决方案是把代码全拿过来重新编译(汗)。
最后我也不知道为什么自己试出来一个新的方法,这个方法尚未从技术上找到原因。也未经过广泛的测试。有兴趣的 TX 可以试试。
如果你要链接到一个 abc.lib 文件,头文件是 abc.h ,动态链接库是 abc.dll 。那么在 pro 文件中先加入下面一行
INCLUDEPATH += D:/Qt/include
INCLUDEPATH 是一个编译变量,存储了所有包含 include 文件的路径,这个目录下保存了 abc.h 文件。然后再加入下面一行:
LIBS += D:/Qt/bin/abc.dll
LIBS 也是一个编译变量,存储了所有需要链接的库文件。看清楚了,不是“ abc.lib ”哦,是“ abc.dll ”。神奇吧,这样居然可以链接成功了( lib 文件可以删了)。喜欢研究的 TX 可以研究研究 mingw 究竟是怎么做的。
6. Qt 项目更换文件目录后编译失败
Qt Creator 编译时不支持中文路径名。对于带空格的路径,如果你想在 pro 文件中加入,需要使用 $$quote 来指定,如: $$quote(C:/mylibs/extra libs/extra.lib) 。另外,如果你习惯了 Windows 下‘ \ ’的话,最好改改你的习惯,在 Qt 中路径习惯用‘ / ’。