Szukaj…


Uwagi

Klasa QObject jest klasą bazową dla wszystkich obiektów Qt.

Przykład QObject

Makro Q_OBJECT pojawia się w prywatnej sekcji klasy. Q_OBJECT wymaga, aby klasa była podklasą QObject . To makro jest niezbędne, aby klasa mogła zadeklarować swoje sygnały / gniazda i użyć systemu metaobiektu Qt.

Jeśli Meta Object Compiler (MOC) znajdzie klasę z Q_OBJECT , przetwarza ją i generuje plik źródłowy C ++ zawierający kod źródłowy meta obiektu.

Oto przykład nagłówka klasy z Q_OBJECT i sygnałem / gniazdami:

#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)

Funkcją dodaną poprzez wywodzenie z QObject i użycie makra Q_OBJECT jest możliwość korzystania z qobject_cast .

Przykład:

class myObject : public QObject
{
    Q_OBJECT
    //...
};

QObject* obj = new myObject();

Aby sprawdzić, czy obj to myObject -type i oddać go do takiego w C ++ można zazwyczaj używać dynamic_cast . Zależy to od włączenia RTTI podczas kompilacji.

Z drugiej strony makro Q_OBJECT generuje kontrole konwersji i kod, którego można użyć w qobject_cast.

myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
    //wrong type
}

To nie zależy od RTTI. Pozwala także na przesyłanie dynamicznych granic bibliotek (za pośrednictwem interfejsów / wtyczek Qt).

QObject Lifetime and Ownership

QObjects posiadają własną alternatywną koncepcję życia w porównaniu do surowych, unikalnych lub współdzielonych wskaźników natywnego C ++.

Obiekty QO mają możliwość zbudowania drzewa obiektowego poprzez zadeklarowanie relacji rodzic / dziecko.

Najprostszym sposobem zadeklarowania tej relacji jest przekazanie obiektu nadrzędnego do konstruktora. Alternatywnie możesz ręcznie ustawić element nadrzędny obiektu QObject , wywołując setParent . To jedyny kierunek, w którym można zadeklarować ten związek. Nie możesz dodać dziecka do klasy rodziców, ale tylko na odwrót.

QObject parent;
QObject child* = new QObject(&parent);

Gdy parent zostanie teraz usunięty w trybie rozwijania stosu, child również zostanie usunięte.

Kiedy usuniemy obiekt QObject , „wyrejestruje się” on sam z obiektu nadrzędnego;

QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.

To samo dotyczy zmiennych stosu:

QObject parent;
QObject child(&parent);

child zostanie usunięte przed parent podczas rozwijania stosu i wyrejestruje się ze swojego rodzica.

Uwaga: Możesz ręcznie wywołać setParent z odwrotną kolejnością deklaracji, co spowoduje przerwanie automatycznego niszczenia.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow