2016-07-26 19 views
0

Ich möchte den einfachsten Weg wissen, das Pimpl-Idiom in Qt-Objekten zu implementieren. Was ich haben will, ist so etwas wie dieses:Wie man das Pimpl-Idiom mit Qt und Unterklassen von QObject verwendet

pimpl.h:

class B; 

class A: public QObject { 
    B *b; 
} 

pimpl.cxx:

class B: public QObject { 
} 

Jetzt, da offensichtlich ist, Qt wird die Klasse B nicht passieren zu Erstellen Sie den Moc dafür. Wie kann das gehandhabt werden? Ich möchte die Implementierung von B in der .cxx explizit haben.

+0

Mögliche Duplikate von [Wie die Qt PIMPL Idiom verwenden?] (Http://stackoverflow.com/questions/25250171/how-to-use-the-qts-pimpl-idiom) – TheDarkKnight

+0

@TheDarkKnight So weit ich kann Siehst du, es gibt keine Erwähnung, dass die Impl-Klasse selbst ein 'QObject' in der verknüpften Antwort ist, also habe ich dafür gestimmt, offen zu bleiben. – anderas

Antwort

4

Sie könnten eine pimpl-private.h erstellen, die die Definition von B enthält und nur in pimpl.cxx enthalten ist, nirgendwo sonst. Dann können Sie moc über diesen Header ausführen.

+0

Ja, das ist in Ordnung. Allerdings habe ich nach einem Hack gesucht, um es in der .cxx-Datei zu behalten, da ich mehr daran gewöhnt bin und für den Großteil des Teils keine Typen deklarieren/einbinden muss. –

+0

@code_not_yet_complete: Siehe https://stackoverflow.com/questions/34928933/why-is-important-to-include-moc-file-at-end-of-a-qt-source-code-file – peppe

1

Es ist möglich, den Code in der CPP-Datei zu haben, indem

#inlude "pimpl.moc" 

am Ende (!) Von "pimpl.cxx" und wieder läuft Qmake hinzufügen. Dies erzeugt eine Makefiule-Regel, um die Datei über moc auszuführen und die Ausgabe in eine "pmipl.moc" zu schreiben, so dass alles auf magische Weise funktioniert.