Sök…
Anmärkningar
QObject
klass är basklassen för alla Qt-objekt.
QObject-exempel
Q_OBJECT
makro visas i privata avsnitt i en klass. Q_OBJECT
kräver att klassen är underklass för QObject
. Detta makro är nödvändigt för att klassen ska deklarera sina signaler / platser och för att använda Qt-meta-objekt-system.
Om Meta Object Compiler (MOC) hittar klass med Q_OBJECT
, bearbetar den den och genererar C ++ källfil som innehåller metaobjektkällkod.
Här är exemplet på Q_OBJECT
med Q_OBJECT
och signal / 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)
En funktionalitet som läggs till genom att härleda från QObject
och använda makro Q_OBJECT
är möjligheten att använda qobject_cast
.
Exempel:
class myObject : public QObject
{
Q_OBJECT
//...
};
QObject* obj = new myObject();
För att kontrollera om obj
är en myObject
typ och att kasta den till sådan i C ++ kan du i allmänhet använda en dynamic_cast
. Detta är beroende av att RTTI har aktiverats under sammanställningen.
Q_OBJECT-makroet på andra händer genererar konverteringskontroller och kod som kan användas i qobject_cast.
myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
//wrong type
}
Detta är inte beroende av RTTI. Och tillåter dig också att kasta över dynamiska biblioteksgränser (via Qt-gränssnitt / plugins).
QObject livstid och ägande
QObjects har sitt eget alternativa livstidskoncept jämfört med ursprungliga C ++: s råa, unika eller delade pekare.
QObjects har möjlighet att bygga en objekttråd genom att förklara förälder / barnrelationer.
Det enklaste sättet att förklara detta förhållande är genom att överföra förälderobjektet i konstruktören. Som lternativ kan du manuellt ställa in föräldern till ett QObject
genom att ringa setParent
. Detta är den enda riktningen för att förklara detta förhållande. Du kan inte lägga till ett barn i en förälderklass utan bara tvärtom.
QObject parent;
QObject child* = new QObject(&parent);
När parent
nu raderas i stack-varva ner child
kommer också att raderas.
När vi tar bort ett QObject
kommer det att "avregistrera" sig själv från moderobjektet;
QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.
Detsamma gäller för stackvariabler:
QObject parent;
QObject child(&parent);
child
kommer att raderas före parent
under stack-varva ner och avregistrera sig själv från sin förälder.
Obs: Du kan manuellt ringa setParent
med en omvänd ordningsdeklaration som kommer att bryta den automatiska förstörelsen.