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
)
#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++ 库是有好处的。再次感谢好心网友的贡献!:-)
|