Wann sollte Q_OBJECT verwendet werden?
Die Dokumentation besagt, dass:
Das Q_OBJECT macro muss das
private-Abschnitt einer Klasse definition
das erklärt seine eigenen Signale und
slots oder andere Dienstleistungen
zur Verfügung gestellt von der Qt-meta-object system.
Aber genau was bedeutet das? Auf dem QObject abgeleiteten Klassen kann ich getrost weglassen? Werden Probleme entstehen, wenn du weglassen, Q_OBJECT auf ein QObject abgeleiteten Klasse und dann beerben? Im Grunde möchte ich ein wenig mehr Informationen, wenn kann ich es weglassen aus meiner Qt-Klassen.
InformationsquelleAutor der Frage Jake Petroules | 2010-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die
Q_OBJECT
makro für alle nicht-Vorlagen-Klassen, die sich vonQObject
.Neben Signale und slots, die
Q_OBJECT
makro bietet die meta-Objekt-Daten ist, dass im Zusammenhang mit einer bestimmten Klasse.Wie gesagt in die Dokumentation:
Angenommen, wir haben folgende Klasse:
Ohne
Q_OBJECT
folgende metaobject-system-Funktionen (unter anderem) funktioniert nicht fürClass
:qobject_cast<Class>()
- aufgrund von fehlenden MetadatenQObject::tr()
- aufgrund von fehlenden Metadatenslots und invokables ersten erklärt in
Class
wenn Sie angerufen werden, oder blickte durch Namen - keineQMetaObject
Methoden für diese Methoden ist, wird weder die Qt-4connect
- aufgrund von fehlenden MetadatenSignale - da
moc
nicht erzeugen Ihre Implementierungen und der code nicht kompiliert.Können Sie es weglassen, natürlich, aber wenn Sie jemals verwenden Sie diese Funktionen, Sie müssen denken Sie daran, dass das makro in der Klassen-Deklaration. Dies ist eine eher spröde Praxis und am besten vermieden werden. Die Einsparungen sind es nicht Wert. Also, warten Sie nicht, fügen Sie die
Q_OBJECT
makro für jede Klasse, die sich vonQObject
als eine Sache der Codierung Politik.Den
Q_OBJECT
makro sollte nie verwendet werden, die auf Klassen, die nicht abgeleitet vonQObject
. Hinzufügen invokables und Eigenschaften, die solche Klassen verwenden Sie dieQ_GADGET
makro statt.InformationsquelleAutor der Antwort liaK
Wenn Sie wollen, um die Signale/slots MUSS das Q_OBJECT makro-und Ableitung der Klasse von QObject.
Ansonsten kann man es weglassen, aber es schadet nicht, sich in alle Qt-gui-Klassen
InformationsquelleAutor der Antwort Martin Beckett
Gut der erste Teil ist ziemlich klar, wie Sie wahrscheinlich schon wissen.. Signale und slots, der rest der Meta-Objekt-system, ist weniger bekannt. Vielleicht eines der nützlichsten features ist dynamische Eigenschaften. Obwohl diese für viele Zwecke verwendet, ich habe Sie zu nehmen Vorteil von Qt-animation-system
QPropertyAnimation
.Gibt es ein wenig mehr Infos über die meta-object-system hier: http://doc.qt.io/archives/4.6/metaobjects.html
Ich denke, die Quintessenz ist, wenn Sie Erben von der QObject-Hierarchie, werfen Sie in die Q_OBJECT-makro unabhängig. Es ist ganz einfach und erspart Ihnen einige potenziell irritierende Probleme die Straße hinunter.
InformationsquelleAutor der Antwort Arnold Spence
Was @liaK sagte ist richtig (kurz: Sie sollte immer die Q_OBJECT-makro in jede Klasse, abgeleitet von QObject).
Eine Sache, die ich noch nicht gesehen, hervorgehoben, ist, dass, wenn Sie nicht explizit setzen die Q_OBJECT makro dann mit der manchmal sehr praktisch qobject_cast funktioniert nicht!!!
InformationsquelleAutor der Antwort lucabox