一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

简介
  通过Qt Creator开发一个动态库,最开始希望只是一个简单的纯C++的动态库,就没有继承QObject,也没有写Q_OBJECT宏。编译时就会报:LNK2001: 无法解析的外部符号public: virtual struct QMetaObject const。绕了不少弯子,终于解决了,把原因分析进行个整理。

面试有个问题:Qt信号槽机制如何才能连接成功?

  这个问题是问的Qt信号槽机制的原理,答案是:public继承QObject,加Q_OBJECT宏。再进一步的回答就是:

“这个宏的作用是,告诉Qt的MOC编译器,需要生成metaobject相关信息,主要是一些成员函数,其中有一条是与类型转换相关,作用就是保证类型转换安全,防止强制指针类型转换时类型不匹配导致的错误。”

解决方案

  把这个错基本就是用到了Qt的特性,却没有MOC编译生成moc文件。需要:

  • public继承QObjec
  • 加Q_OBJECT宏
  • 重新构建工程,如果是QtCreator ,右击工程文件夹,重新qmake,参考下图:

总结

  主要是对Qt不熟,Creator中构建项目是编译+链接,重新根据*.h和*.cpp文件进行生成工程是qmake。构建项目、重新构建项目都不会重新qmake工程。

posted on 2024-02-19 19:02  一杯清酒邀明月  阅读(832)  评论(0编辑  收藏  举报