Zoeken…
Opmerkingen
QObject
klasse is de basisklasse voor alle Qt-objecten.
QObject voorbeeld
Q_OBJECT
macro verschijnt in het privégedeelte van een klasse. Q_OBJECT
vereist dat de klasse een subklasse is van QObject
. Deze macro is nodig voor de klasse om zijn signalen / slots aan te geven en het Qt meta-object systeem te gebruiken.
Als Meta Object Compiler (MOC) klasse vindt met Q_OBJECT
, verwerkt het dit en genereert het C ++ bronbestand met de broncode van het meta-object.
Hier is het voorbeeld van klassenkop met Q_OBJECT
en signaal / 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)
Een functionaliteit die wordt toegevoegd door af te leiden van QObject
en de macro Q_OBJECT
te gebruiken, is de mogelijkheid om qobject_cast
te gebruiken.
Voorbeeld:
class myObject : public QObject
{
Q_OBJECT
//...
};
QObject* obj = new myObject();
Om te controleren of obj
een myObject
type is en om het naar C ++ te casten, kunt u meestal een dynamic_cast
. Dit is afhankelijk van het inschakelen van RTTI tijdens het compileren.
De macro Q_OBJECT daarentegen genereert de conversiecontroles en code die kunnen worden gebruikt in de qobject_cast.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
Dit is niet afhankelijk van RTTI. En kunt u ook dynamische bibliotheekgrenzen overschrijden (via Qt-interfaces / plug-ins).
QObject Lifetime and Ownership
QObjects komen met hun eigen alternatieve levensduurconcept in vergelijking met de onbewerkte, unieke of gedeelde aanwijzers van native C ++.
QObjects hebben de mogelijkheid om een objectboom op te bouwen door ouder / kind-relaties aan te geven.
De eenvoudigste manier om deze relatie aan te geven, is door het bovenliggende object in de constructor door te geven. Als LTERNATIEVE kunt u handmatig de ouder van een set QObject
door te bellen naar setParent
. Dit is de enige richting om deze relatie te verklaren. Je kunt geen kind toevoegen aan een ouderklasse, maar alleen andersom.
QObject parent;
QObject child* = new QObject(&parent);
Wanneer parent
nu wordt verwijderd in stapel-afwikkelen, wordt child
ook verwijderd.
Wanneer we een QObject
verwijderen, zal het zichzelf "afmelden" van het bovenliggende object;
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
Hetzelfde geldt voor stapelvariabelen:
QObject parent;
QObject child(&parent);
child
zal worden verwijderd vóór parent
tijdens stapel-afwikkelen en zichzelf afmelden bij zijn ouder.
Opmerking: u kunt setParent
handmatig oproepen met een omgekeerde volgorde van aangifte waardoor de automatische vernietiging wordt verbroken.