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.