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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow