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.