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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow