Ich arbeite mit Qt 5.7 (C++).Definieren Sie eine QObject-abgeleitete Klasse in einem anonymen Namespace?
Innerhalb der cpp-Datei einer Klasse verwende ich einen anonymen Namespace, um eine Klasse (ein Dienstprogramm) zu erstellen, die ich nur in dieser Datei verwenden werde.
Allerdings habe ich Linking Fehler, wenn die Dienstprogramm-Klasse von einer Qt-Klasse abgeleitet ist. Ich denke, dass das Problem am Makro Q_OBJECT liegt, wenn ich es nicht hinzufüge, bekomme ich die Fehler nicht. Aber in jeder von Qt abgeleiteten Klasse ist es zwingend erforderlich, das Makro Q_OBJECT zu verwenden.
Wie kann ich diesen Fehler vermeiden? Gibt es einen anderen Ansatz, um eine Dienstprogrammklasse mit Dateibereich zu haben?
Einfaches Beispiel zum Anzeigen von Fehlern: Die Klasse CMyClass verwendet eine Dienstprogrammklasse (mit dem Namen CUtility), die von QWidget abgeleitet wird.
Vielen Dank.
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();
}
Die Fehler sind:
LNK2001: extern Symbol „public: virtual Struktur QMetaObject const * __cdecl 'anonymer Namespace' :: CUtility :: metaObject (void) const "(? metaObject @ CUtility ? @ A0x27a8253c @@ UEBAPEBUQMetaObject @@ XZ)
LNK2001: extern Symbol? "Public: virtual void * __cdecl` anonymen Namespace ':: CUtility :: qt_metacast (char const *)"(qt_metacast @ CUtility @ A0x27a8253c @@ UEAAPEAXPEBD @ Z) sin Resolver
LNK2001: extern Symbol "public: virtual int __cdecl` anonymen Namespace ':: CUtility :: qt_metacall (enum QMetaObject :: Anruf, int, void * *)"? (qt_metacall @ CUtility @? A0x27a8253c @@ UEAAHW4Call @ QMetaObject @@ HPEAPEAX @ Z) sin Resolver
Haben Sie am Ende von CMyClass.cpp das übliche '#include" CMyClass.moc "versucht und dann qmake + make erneut ausgeführt? – peppe