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.