Q_OBJECT是什么东西?
在QObjectdefs.h里,有:
//-------------------------------------------------------
#define
slots // slots: in class
#define signals protected // signals: in
class
#define emit // emit
signal
#define Q_CLASSINFO(
name, value ) // class info
#define Q_PROPERTY( text ) // property
#define Q_OVERRIDE( text ) // override
property
#define Q_ENUMS( x
)
#define Q_SETS( x
)

/* tmake ignore Q_OBJECT
*/

#define Q_OBJECT \
public: \
QMetaObject *metaObject() const {
\
return staticMetaObject(); \
}
\
const char *className() const; \
static QMetaObject* staticMetaObject(); \
QT_TR_FUNCTION \
protected: \
void initMetaObject(); \
private:
\
static QMetaObject *metaObj;
//-------------------------------------------------------

再看看生成目录下面的moc_xx.cpp,可见Q_OBJECT实际上是实现signal机制的几个函数和成员。

 

 

error: stray '\241' in program

这种错误一班是出现在编辑代码时 源程序中有非法字符,需要去掉非法字符
尝试把该句代码的前面空格去掉,然后Tab下,重新整理下格式

Qt Creator编译的程序,在其工程文件夹下会有一个debug文件夹,其中有程序的.exe可执行文件。但Qt
Creator默认是用动态链接的,就是可执行程序在运行时需要相应的.dll文件。我们点击生成的.exe文件,首先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。”表示缺少mingwm10.dll文件。

            解决这个问题我们可以将相应的.dll文件放到系统中。在Qt
Creator的安装目录的qt文件下的bin文件夹下(我安装在了D盘,所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll文件。在这里找到mingwm10.dll文件,将其复制到C:\WINDOWS\system文件夹下,即可。下面再提示缺少什么dll文件,都像这样解决就可以了。

 

 

 

 

QT中的 undefined reference to vtable for "xxx::xxx" 错误解决


QT应用程序在link的时候提示undefined reference to vtable for "xxx::xxx",第一次遇到这个错误的时候还以为是虚函数使用出的问题,当然如果虚函数使用不当,比如在某个实现类中只有声明没有定义,也会报类似的错误。

实际上QT中的这种错误很可能是由于在该类中使用了Q_OBJECT宏的缘故,当把出错的类中的Q_OBJECT注释掉,编译链接如果不报任何错误,恭喜,你绝对错在了Q_OBJECT上。关于这个错误的说明网上可以搜到一堆,是和moc文件相关的,牵涉到QT的实现机制,不去细究,只说一下其解决方法:


如果是一般的QT工程(指的是用QT-designer新建的工程,或者用KDevelop新建的qmake工程),这类工程的特征是主目录下会有个工程文件:project-name.pro(kdevelop的qmake工程的project-name.pro);
这种工程只要重新qmake一下就可以解决问题,即移除所有编译出来的.o文件,然后由工程文件重新生成Makefile,这样qmake会把关于moc的一些选项加入Makefile,接着重新编译即可。


如果是KDevelop中建的其他工程如KDE工程,这样的工程下并没有QT的工程文件,那怎么办呢?不用紧张,工程目录下应该有个/debug/src目录,切换到该目录,里面是不是有一些已经编译出来的.o文件,甚至还有class-name.moc.cpp这样的文件。接下来要做的就是把这些文件统统删除,然后在kdevelop中重新编译整个工程,然后就等着吧,kdevelop会重新运行automake工具重新配置./configure,然后重新生成Makefile,然后就是编译、连接通过,是不是很简单呢?当初可花了我不少时间,。。。


总结,这个“Undefined reference to vtable for
***”问题的原因在于生成moc文件,并在编译的时候将其包含进对应的类中,不过并不需要我们手工去编译生成moc文件,或者手工修改Makefile。希望这些文字可以对您有哪怕很小一点的帮助!

 

 

Windows环境正确配置QT 

 引用网友的正确安装配置方法如下:


1.
下载代码:到官方网站http://www.trolltech.com/developer/downloads/qt/windows下载windows下的opensource的压缩包,或者来这里
http://www.qtnode.net/wiki/Download_Qt下载名字类似qt-win-opensource-src-4.2.3.zip。然后下载编译VS的QT库的补丁http://downloads.sourceforge.net/qtwin/acs-4.2.3-patch1.zip,解压这两个包到一个目录,如C:\Qt\4.2.3


2.配置环境
配置VS的vsvars32.bat,一般在C:\Program Files\Microsoft
Visual Studio
8\Common7\Tools下面在PATH的头部添加QT所在目录,如C:\Qt\4.2.3,在INCLUDE上添加C:\Qt\4.2.3\include,LIB中添加C:\Qt\4.2.3\lib,具体的目录是你刚才解压的目录,打开这个批处理文件,看着原来怎么写的你就学着写好了。俺的类似如下:
@set
PATH=C:\Qt\4.2.3;C:\Program Files\Microsoft Visual Studio
8\Common7\IDE;。。。%PATH%
@set INCLUDE=C:\Qt\4.2.3\include;C:\Program
Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;。。。%INCLUDE%
@set
LIB=C:\Qt\4.2.3\lib;C:\Program Files\Microsoft Visual Studio
8\VC\ATLMFC\LIB;。。%LIB%
打开一个cmd命令行窗口,把这个文件托过来执行,这样,你打开的cmd就具有上面设置的环境变量了,但是这些变量只针对你当前的cmd,不会更改本机配置,所以,不要关闭cmd窗口,执行下nmake
/?看看能不能找到nmake命令

3.打补丁
执行刚才解压acs-4.2.2-patch1.zip之后的那个installpatch42.bat,直接托过来运行就好了。
C:\Qt\4.2.3>
installpatch42.bat

4.配置QT安装,QT需要一些,定位到QT的目录下面,执行C:\Qt\4.2.3>
qconfigure.bat msvc.net -release
-no-stl上面的选项根据你自己需要来写啊,比如你要debug版,就加个-debug选项,想要STL就把后面的去掉。第一个参数表示你编译出来的为那个VS版本使用,msvc
对应Visual Studio 6.0,msvc.net对应2003,我的2005就用
msvc2005了。如果你不怕一会编译时间太长,你就干脆直接输入C:\Qt\4.2.3> qconfigure.bat
msvc2005会输出一些配置信息,默认情况会编译很多东西。看好了,是不是你想要的,没有问题,就同意好了

5.编译
运行nmake
C:\Qt\4.2.3>
nmake
慢慢等吧,或者让它自己在那跑,你自己继续工作。

6.配置环境,
我的电脑>属性>高级>环境变量>用户变量里面设置几个变量:
PATH中增加C:\Qt\4.2.3\bin(如果没有就创建),
创建QMAKESPEC值为
win32-msvc2005,这个值还是根据你要生成的Vs版本,6.0 使用win32-msvc, 2003 使用win32-msvc.net, 2005就是
win32-msvc2005
创建QTDIR值为
C:\Qt\4.2.3
如果你机器上安装多个版本的QT,就通过这三个环境变量来切换了,我同时有C:\Qt\4.0.0,那么就把那些前缀都换成C:\Qt\4.0.0,就使用4.0了。最后为了使的你刚才修改的环境变量生效,重启cmd,可以通过C:\>
qmake -v来看你使用的QT版本。

7.整个程序测试下hello.cpp
#include
<QApplication>
#include <QLabel>

int main(int argc, char
**argv) {
QApplication app(argc, argv);
QLabel *label = new
QLabel("Hello World!");

label->show();


return app.exec();
}

执行
C:\> qmake -project -t vcapp -o
projectname.pro
C:\>
qmake
在目录下面会生成projectname.vcproj,有这个就可以使用VS打开了,剩下的和普通的C++程序一样编译,运行,调试好了。


以上就是在 Windows 系统环境下配置 QT
的方法,我照着做成功了,相信大家也是没有问题的。C++ 博大精深,多了解一些 C++
库是有好处的。再次感谢好心网友的贡献!:-)

 

 

 

 

 

 

posted on 2011-04-30 20:31  夜叉ben  阅读(427)  评论(0)    收藏  举报