qt学习笔记1

#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,编译才能成功,否则会出错链接错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值