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.