Buscar..


Observaciones

QObject clase QObject es la clase base para todos los objetos Qt.

Ejemplo de QObject

Q_OBJECT macro Q_OBJECT aparece en la sección privada de una clase. Q_OBJECT requiere que la clase sea subclase de QObject . Esta macro es necesaria para que la clase declare sus señales / ranuras y use el sistema de metaobjetos Qt.

Si Meta Object Compiler (MOC) encuentra la clase con Q_OBJECT , la procesa y genera el archivo fuente de C ++ que contiene el código fuente del objeto meta.

Este es el ejemplo del encabezado de clase con Q_OBJECT y señal / ranuras:

#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 funcionalidad que se agrega derivando de QObject y utilizando la macro Q_OBJECT es la capacidad de usar qobject_cast .

Ejemplo:

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

QObject* obj = new myObject();

Para verificar si obj es un tipo myObject y para convertirlo en C ++, generalmente puede usar un dynamic_cast . Esto depende de tener habilitado RTTI durante la compilación.

La macro Q_OBJECT en las otras manos genera las verificaciones de conversión y el código que se puede usar en qobject_cast.

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

Esto no depende de RTTI. Y también le permite verter límites de bibliotecas dinámicas (a través de interfaces / complementos Qt).

QObject vida y propiedad

Los QObjects vienen con su propio concepto alternativo de vida en comparación con los punteros originales, únicos o compartidos de C ++.

QObjects tiene la posibilidad de construir un objecttree declarando las relaciones padre / hijo.

La forma más sencilla de declarar esta relación es pasar el objeto principal en el constructor. Como alternativa, puede establecer manualmente el padre de un QObject llamando a setParent . Esta es la única dirección para declarar esta relación. No puede agregar un niño a una clase de padres, sino solo al revés.

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

Cuando el parent ahora se elimina en la pila, el child también se eliminará.

Cuando eliminamos un objeto QObject , se "anulará el registro" del objeto principal;

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

Lo mismo se aplica a las variables de pila:

QObject parent;
QObject child(&parent);

child se eliminará antes que el parent durante la retirada de la pila y se anulará el registro de su padre.

Nota: Se puede llamar manualmente setParent con un orden inverso de la declaración que se romperá la destrucción automática.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow