qt学习笔记1

来源:互联网 发布:win7 网络连接不可用 编辑:程序博客网 时间:2024/05/21 10:04

#include <QApplication>#include "finddialog.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    FindDialog *dialog = new FindDialog;    dialog->show();    return app.exec();}
具体的代码可以参照该书本,书中说:为了编译这个程序,还像以前一样运行qmake。由于在FindDialog中包含了Q_OBJECT宏,由qmake生成的makefile会保换特殊的规则运行moc(Qt的原对象编译器)。

为了确保moc正确工作,类定义必须放在头文件而不能放在实现文件中。由moc生成的代码中包含这个头文件,并加入它自己实现的C++代码。
使用了Q_OBJECT宏的类必须运行moc。如果使用qmake,那么makefile里自动包含相关的规则。如果忘记了运行moc,就会发生连接错误。不同的编译器给出的提示信息不同,有的会非常晦涩。GCC给出的错误信息如下:
   finddialog.o: In function 'FindDialog::tr(char const*, charconst*)':
     /usr/lib/qt/src/corelib/global/qglobal.h:1430:undefined reference to
     'FindDialog::staticMetaObject'
     
Visual C++中的输出是这样:

    finddialog.obj : error LNK2001: unresolved external symbol
     "public:~virtual int __thiscallMyClass::qt_metacall(enum QMetaObject
     ::Call,int,void * *)"
这时需要重新运行qmake,更新makefile,然后编译程序。

看了书本上,那么简单的几个字。。。真心是没有看懂该怎么处理。。后来找下网上的资料。。。终于摸索出了。。正确的结果!

其解决方法:

利用命令行进入main.cpp所在的目录【finddialog.h和finddialog.cpp与之在同一目录下】输入moc finddialog.h -o moc_finddialog.cpp命令之后,主目录下多了一个moc_finddialog.cpp文件,Add Files to Project命令将其加入工程,编译后就可以了。

这是因为:当要在GUI中用到信号与槽,就需在.h文件中的类里写入Q_OBJECT宏。而任何含有Q_Object的类都必须使用Qt的moc工具生成对应的cpp文件,然后在项目里面包含这个cpp,编译才能成功,否则会出错链接错误。

原创粉丝点击