Ich habe dieses Problem bei der Verwendung einer "privaten Klasse" in Qt festgestellt, wenn das Programmiermuster " PIMPL " (private Implementierung) verwendet wurde. Qt verwendet dieses Modell im gesamten Quellcode. Ich habe es selbst wirklich gemocht.
Diese Technik beinhaltet die Verwendung einer "privaten" vorwärts deklarierten Klasse in einer öffentlichen Header-Datei, die von der "öffentlichen" Klasse verwendet wird (dh sie ist "übergeordnet"). Das übergeordnete Element verfügt dann über einen Zeiger auf eine Instanz der privaten Klasse als Datenelement.
Die "private" Klasse wird vollständig in der cpp-Datei für die öffentliche Klasse definiert. Es gibt KEINE Header-Datei für die private Klasse.
Die ganze "Drecksarbeit" wird mit dieser Privatklasse erledigt. Dies verbirgt normalerweise die gesamte Implementierung Ihrer öffentlichen Klasse, einschließlich aller anderen privaten Mitglieder (sowohl Daten als auch Funktionen).
Ich empfehle dringend, sich mit dem PIMPL-Muster vertraut zu machen - insbesondere, wenn Sie jemals die interne Qt-Quelle lesen werden.
Ohne diesen Codierungsstil weiter zu erläutern, ist hier der Punkt, der sich auf diese Frage bezieht ... Damit das Q_OBJECT
Makro innerhalb der cpp für die "private" Klasse QObject funktioniert, die Signale / Slot usw. verwenden kann, mussten Sie dies explizit tun Fügen Sie die .moc zur öffentlichen Klasse in die cpp ein :
#include "MyPublicClass.moc"
Sie können alle IDE-Warnungen zu dieser Zeile ignorieren.
Ich bin mir nicht sicher, ob es genau auf den Punkt kommt, aber diese Aufnahme sehe ich immer NACH der Definition der privaten Klasse und nicht oben auf dem CPP (wie Includes normalerweise platziert werden). Das cpp-Layout sieht also folgendermaßen aus:
- "Normale" Includes sind definiert.
- Die private Klasse ist definiert.
- Der Moc für die öffentliche Klasse ist # enthalten.
- Die Implementierung der öffentlichen Klasse ist definiert.