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.