Ricerca…
Osservazioni
QObject
classe QObject
è la classe base per tutti gli oggetti Qt.
Esempio di QObject
Q_OBJECT
macro Q_OBJECT
viene visualizzata nella sezione privata di una classe. Q_OBJECT
richiede che la classe diventi sottoclasse di QObject
. Questa macro è necessaria affinché la classe dichiari i suoi segnali / slot e utilizzi il sistema meta-oggetto Qt.
Se Meta Object Compiler (MOC) trova la classe con Q_OBJECT
, la elabora e genera il file sorgente C ++ contenente il codice sorgente del meta oggetto.
Ecco l'esempio dell'intestazione della classe con Q_OBJECT
e 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)
Una funzionalità che viene aggiunta derivando da QObject
e utilizzando la macro Q_OBJECT
è la possibilità di utilizzare qobject_cast
.
Esempio:
class myObject : public QObject
{
Q_OBJECT
//...
};
QObject* obj = new myObject();
Per verificare se obj
è un tipo myObject
e per lanciarlo in tale in C ++ puoi generalmente usare un dynamic_cast
. Questo dipende dall'avere RTTI abilitato durante la compilazione.
La macro Q_OBJECT d'altra parte genera i controlli di conversione e il codice che possono essere utilizzati in qobject_cast.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
Questo non dipende da RTTI. Inoltre, consente di eseguire il cast attraverso i confini delle librerie dinamiche (tramite interfacce / plug-in Qt).
QObject Lifetime and Ownership
QObjects viene fornito con il proprio concetto di durata alternativa rispetto ai puntatori grezzi, univoci o condivisi del C ++ nativo.
QObjects ha la possibilità di creare un oggetto object dichiarando le relazioni genitore / figlio.
Il modo più semplice per dichiarare questa relazione è passare l'oggetto genitore nel costruttore. Come alternativa puoi impostare manualmente il genitore di un QObject
chiamando setParent
. Questa è l'unica direzione per dichiarare questa relazione. Non è possibile aggiungere un figlio a una classe di genitori, ma solo il contrario.
QObject parent;
QObject child* = new QObject(&parent);
Quando il parent
ora viene eliminato nel child
stack-unwind, verrà eliminato anche.
Quando cancelliamo un oggetto QObject
esso "annullerà la registrazione" di per sé dall'oggetto padre;
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
Lo stesso vale per le variabili dello stack:
QObject parent;
QObject child(&parent);
child
verrà cancellato prima del parent
durante lo sbobinamento e si annullerà la registrazione dal genitore.
Nota: è possibile chiamare manualmente setParent
con un ordine inverso di dichiarazione che romperà la distruzione automatica.