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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow