Metaobjektsystem

Metaobjektsystemet i Qt-ramverket ger stöd för ytterligare funktioner i C++-språket som behövs för introspektion och reflektion genom att tillhandahålla en QObject-klass med viss funktionalitet som bas. Faktum är att de allra flesta klasser i Qt är ättlingar till denna klass och implementerar detta system. [ett]

Implementering

Metaobjektsystemet inkluderar: klassen QObject, verktyget moc (Meta-Object Compiler) och det valfria makrot Q_OBJECT.

  1. QObject är basklassen för alla Qt-klasser
  2. Metaobjektkompilatorn förser varje underklass av QObject med den nödvändiga C++-koden för att implementera metaobjekt-kapacitet, beroende på närvaron eller frånvaron av Q_OBJECT-makrot. Kompilatorn ändrar inte källfilen, utan skapar en annan innehållande metaobjektkod för var och en av dessa klasser.
  3. Makrot Q_OBJECT krävs av kompilatorn för metaobjekt. Genom att hitta detta makro i källkoden deklarerar kompilatorn några funktioner som är nödvändiga för analysen av det interna tillståndet och måste implementeras i varje underklass av QObject: metaObject(), tr(), qt_metacall() och några andra. [2]

Det är acceptabelt att använda QObject som basklass utan Q_OBJECT-makrot och metaobjektkoden. Men i det här fallet kommer varken signaler och slots eller de andra funktionerna som beskrivs nedan att vara tillgängliga. Ur metaobjektsystemets synvinkel är en underklass av QObject utan metakod densamma som dess närmaste förfader med metaobjektkod. Detta betyder att QMetaObject::className() inte kommer att returnera det faktiska namnet på din klass, utan klassnamnet på den förfadern.

Makron som används av Meta-Object Compiler för att kommentera kod är standard C++-makron. De bör kännas igen korrekt av alla verktyg som kan tolka C++-kod. Genom att lägga till makrot Q_OBJECT lägger programmeraren till deklarationen av flera funktioner.

QObject-klassen, i närvaro av Q_OBJECT-makrot, innehåller stöd för:

  1. metaobjektinformation. Den innehåller information om arv av klasser, vilket gör att du kan avgöra om klasser är direkta ättlingar, samt ta reda på namnet på klassen. Information om klassmetametoder (signaler, slots och andra anropade funktioner med makrot Q_INVOKABLE) tillhandahålls också.
  2. Dynamisk casting med qobject_cast() för QObject-klasser. Funktionen qobject_cast() beter sig på samma sätt som standard C++ dynamic_cast()med fördelarna att den inte kräver RTTI-stöd och fungerar över dynamiska biblioteksgränser. Funktionen försöker kasta sitt argument till pekarens typ som anges i vinkelparenteserna, och returnerar en icke-null-pekare om objektet är av rätt typ (bestäms vid körning), eller nullptrom objektets typ är inkompatibel.
  3. Timer, och följaktligen händelseslingan. Dessutom finns det en filtreringsmekanism för att fånga upp händelsedata.
  4. Möjlighet att internationalisera applikationen med metoderna QObject::tr() och QObject::trUtf8().
  5. Stöd för signaler och slots, som används för att kommunicera mellan löst kopplade objekt.
  6. Stöd för egenskaper för att få information om Qt-objekt från icke-C++-kod som QML eller Qt Script.

Användningen av metaobjektsystem har genomgått en del kritik. Qt-dokumentationen har framfört flera argument för metaobjektsystem, inklusive fördelarna med kodgenerering, dynamiska GUI:er, automatisk länkning till skriptspråk utan att lägga till begränsningar och den lika goda prestandan hos moc:s signaler och slotsmekanismer. [3] [4]

Länkar

  1. Meta-Object System - QtCore 5.1 . Qt Project (4 juli 2013). Hämtad 4 juli 2013. Arkiverad från originalet 26 augusti 2013.
  2. Använda Meta-Object Compiler (moc) . Qt Project (4 juli 2013). Hämtad 4 juli 2013. Arkiverad från originalet 26 augusti 2013.
  3. Varför använder Qt Moc för signaler och slots? . Qt Project (4 juli 2013). Hämtad 4 juli 2013. Arkiverad från originalet 20 oktober 2013.
  4. Återimplementera Qt moc med libclang . Olivier Goffart (4 juli 2013). Hämtad 4 juli 2013. Arkiverad från originalet 15 juli 2013.