6.4 问题与解答

问:初学 Linux 下的 Qt 编程,请教个大家一下关于 QT 程序的运行环境的问题。用 QT 编译好的程序,可不可以在不启动 X-Windows(KDE/GNOME)的情况下直接在 X 终端下运 行呢?

答:需要启动 X,至少要需要启动 X Server。因为 Qt 在 X11 上的运行机制是要依赖本 地原生的图形环境的。如果是 QT/E 的话只要启动了 Framebuffer 就可以了。

问:请问一下,我装好了 Dev C++ 和 QT4.2.2 自带的例子已经能够编译了,但是今天 编译一个例子就不能通过,不知道是什么问题,请指教。

我的程序是:

#include <qapplication.h>
#include <qlabel.h>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel *label = new QLabel("Hello Qt!", 0);
    app.setMainWidget(label);
    label->show();
    return app.exec();
}

编译后的出错信息是:

C:\b>make
mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory `C:/b'
g++ -c -O2 -O2 -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_D
LL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN
-I"C:/Qt/4.2.2/include/QtCore" -I"C:/Qt/4.2.2/include/QtCore" -I"C:/Qt/4.2.2/in
clude/QtGui" -I"C:/Qt/4.2.2/include/QtGui" -I"C:/Qt/4.2.2/include" -I"." -I"C:/Q
t/4.2.2/include/ActiveQt" -I"release" -I"." -I"..\Qt\4.2.2\mkspecs\default" -o r
elease\hello.o hello.cpp
hello.cpp: In function `int qMain(int, char**)':
hello.cpp:8: error: 'class QApplication' has no member named 'setMainWidget'mingw32-make[1]:
*** [release\hello.o] Error 1
mingw32-make[1]: Leaving directory `C:/b'
mingw32-make: *** [release] Error 2
error: 'class QApplication' has no member named 'setMainWidget'

答:setMainWidget()这个方法是 Qt 3 中的方法,而 Qt 4 中是没有的。所以从你提供的出错信息上可以判断,你机器上安装的是 Qt 4 的某个版本,而你的程序的代码是用 Qt 3 写成的。由于从 Qt 3 到 Qt 4,其语法和类库等都发生了很大的变化,很多程序是不通用 的。所以你要么使用 Qt 4 编译 Qt 4 的程序,或者都换成是 Qt 3 的。

我的建议是,如果不是维护已有项目需要的话,最好还是学习 和使用 Qt4 吧,Qt 的网 站上说,Qt 3.3 系列将维护到 July 2007,也就是后续将不会提供支持了。

问:我初学 Qt 编程,请问如何入门,有什么建议吗?现在我还无处着手。 答:对于初学者而言,建议选定最新的 Qt 版本(4.5 以上),按照本书章节的顺序同时结合 Qt Assistant 和 Qt Demo 循序渐进的学习。注意刚开始时,可以照猫画虎,把书上的例子反复体会,然后最好是带着问题去学习,中间不要忘记多泡论坛和专家的博客(本书 附录中对 Qt 的论坛和博客有详细介绍)。

问:我最近开始学习 Qt,因为需要编写一个类似 Google 地图搜索的图形界面,但是不知 道怎么下手,各位有作过类似东东的吗,给小弟一点建议,应该怎么下手作啊,谢谢了,或者有 类似的源代码给我参考一下马?

答:这方面有一些思路可供参考。可以利用 Graphics View 显示地图。使用 QGraphics View 和 QGraphicsScene 进行坐标变换,使用 QGraphics View 的 scale()方法实现地图的 缩放。如果是初学的话,建议可以学习本书并结合 Qt Demo 的例子,这样提高比较快。