Suche…
Bemerkungen
QObject
Klasse ist die Basisklasse für alle Qt-Objekte.
QObject-Beispiel
Q_OBJECT
Makro wird im privaten Abschnitt einer Klasse Q_OBJECT
. Q_OBJECT
setzt Q_OBJECT
dass die Klasse eine Unterklasse von QObject
. Dieses Makro ist erforderlich, damit die Klasse ihre Signale / Slots deklariert und das Qt-Metaobjektsystem verwendet.
Wenn der Meta Object Compiler (MOC) eine Klasse mit Q_OBJECT
, verarbeitet er sie und generiert eine C ++ - Quelldatei, die Q_OBJECT
Quellcode enthält.
Hier ist das Beispiel eines Klassen-Headers mit Q_OBJECT
und Signal / Slots:
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
public slots:
void setNumber(double number);
signals:
void numberChanged(double number);
private:
}
qobject_cast
T qobject_cast(QObject *object)
Eine Funktionalität, die durch Ableiten von QObject
und Verwenden des Q_OBJECT
QObject
hinzugefügt wird, ist die Möglichkeit, qobject_cast
.
Beispiel:
class myObject : public QObject
{
Q_OBJECT
//...
};
QObject* obj = new myObject();
Um zu prüfen, ob obj
ein myObject
Typ ist, und um es in C ++ in ein dynamic_cast
können Sie im Allgemeinen einen dynamic_cast
. Dies hängt davon ab, dass RTTI während des Kompilierens aktiviert ist.
Das Q_OBJECT-Makro an den anderen Händen generiert die Konvertierungsprüfungen und den Code, der im qobject_cast verwendet werden kann.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
Dies ist nicht von RTTI abhängig. Außerdem können Sie dynamische Bibliotheksgrenzen verwenden (über Qt-Schnittstellen / Plugins).
QObject-Lebensdauer und Eigentum
QObjects verfügen über ein eigenes alternatives Lebenszeitkonzept im Vergleich zu den unverarbeiteten, eindeutigen oder gemeinsam genutzten Zeigern von C ++.
QObjects haben die Möglichkeit, einen Objektbaum zu erstellen, indem Sie übergeordnete / untergeordnete Beziehungen definieren.
Die einfachste Art, diese Beziehung zu deklarieren, besteht darin, das übergeordnete Objekt im Konstruktor zu übergeben. Als lternative können Sie manuell die Eltern eines gesetzt QObject
durch den Aufruf setParent
. Dies ist die einzige Richtung, um diese Beziehung zu erklären. Sie können kein Kind zu einer Elternklasse hinzufügen, sondern nur umgekehrt.
QObject parent;
QObject child* = new QObject(&parent);
Wenn parent
jetzt in Stapel-Abwickler gelöscht wird child
werden ebenfalls gelöscht.
Wenn wir ein QObject
löschen, wird die Registrierung vom übergeordneten Objekt QObject
.
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
Gleiches gilt für Stackvariablen:
QObject parent;
QObject child(&parent);
child
wird während des Stack-Unwind vor dem parent
Element gelöscht und die Registrierung des übergeordneten Elements aufgehoben.
Hinweis: Sie können setParent
manuell in umgekehrter Reihenfolge aufrufen, setParent
die automatische Vernichtung setParent
wird .