【发布时间】:2017-05-27 14:38:09
【问题描述】:
我正在使用 Qt 5.7 (C++)。
在一个类的 cpp 文件中,我使用匿名命名空间来创建一个类(一些实用程序),我将只在该文件中使用它。
但是,如果实用程序类派生自 Qt 类,则会出现链接错误。我认为问题出在 Q_OBJECT 宏上,如果我不添加它,我不会得到错误。但在任何 Qt 派生类中都必须/建议使用 Q_OBJECT 宏。
如何避免这个问题? 还有其他方法可以让实用程序类具有文件范围吗?
显示错误的简单示例:类 CMyClass 使用派生自 QWidget 的实用程序类(名为 CUtility)。
谢谢。
CMyClass.h
class CMyClass
{
public:
CMyClass();
void someMethod();
};
CMyClass.cpp
#include <QtWidgets>
#include "CMyClass.h"
namespace
{
class CUtility : public QWidget
{
Q_OBJECT
public:
CUtility(QWidget *p_parent = 0) : QWidget(p_parent){qDebug() << "CUtility constructor";}
void utilityMethod() {qDebug() << "This is CUtility::utilityMethod()";}
};
}
CMyClass::CMyClass()
{
qDebug() << "CMyClass constructor.";
}
void CMyClass::someMethod()
{
qDebug() << "This is CMyClass::someMethod().";
CUtility p_myUtil;
p_myUtil.utilityMethod();
}
错误是:
LNK2001: 未解析的外部符号“public: virtual struct QMetaObject const * __cdecl `anonymous namespace'::CUtility::metaObject(void)const” (?metaObject@CUtility@?A0x27a8253c@@UEBAPEBUQMetaObject@@XZ)
LNK2001:未解析的外部符号“public: virtual void * __cdecl `anonymous namespace'::CUtility::qt_metacast(char const *)” (?qt_metacast@CUtility@?A0x27a8253c@@UEAAPEAXPEBD@Z) 罪解析器
LNK2001: 未解析的外部符号“public: virtual int __cdecl `anonymous namespace'::CUtility::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@CUtility@?A0x27a8253c@@UEAAHW4Call@ QMetaObject@@HPEAPEAX@Z) 罪解析器
【问题讨论】:
-
你有没有尝试过CMyClass.cpp末尾通常的
#include "CMyClass.moc",然后重新运行qmake+make?