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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow