Meta-objektum rendszer

A Qt keretrendszer meta-objektum rendszere támogatja a C++ nyelv további szolgáltatásait, amelyek az önvizsgálathoz és a reflexióhoz szükségesek azáltal, hogy egy QObject osztályt biztosít néhány funkcióval alapként. Valójában a Qt osztályainak túlnyomó többsége ennek az osztálynak a leszármazottja, és ezt a rendszert valósítja meg. [egy]

Megvalósítás

A meta-objektum rendszer tartalmazza: a QObject osztályt, a moc (Meta-Object Compiler) segédprogramot és az opcionális Q_OBJECT makrót.

  1. A QObject az összes Qt osztály alaposztálya
  2. A meta-objektum fordító a QObject minden egyes alosztályát ellátja a szükséges C++ kóddal a metaobjektum képességek megvalósításához, a Q_OBJECT makró meglététől vagy hiányától függően. A fordító nem változtatja meg a forrásfájlt, hanem minden egyes osztályhoz más-más meta-objektum kódot hoz létre.
  3. A Q_OBJECT makróra a metaobjektum fordítónak szüksége van. Megtalálva ezt a makrót a forráskódban, a fordító deklarál néhány olyan függvényt, amelyek a belső állapot elemzéséhez szükségesek, és amelyeket a QObject egyes alosztályaiban meg kell valósítani: metaObject(), tr(), qt_metacall() és néhány másik. [2]

Elfogadható a QObject használata alaposztályként a Q_OBJECT makró és metaobjektum kód nélkül. Ebben az esetben azonban sem a jelek és slotok, sem az alább leírt egyéb szolgáltatások nem lesznek elérhetők. A meta-objektum rendszer szempontjából a QObject metakód nélküli alosztálya megegyezik a legközelebbi meta-objektum kóddal rendelkező ősével. Ez azt jelenti, hogy a QMetaObject::className() nem az osztály tényleges nevét adja vissza, hanem az ős osztálynevét.

A Meta-Object Compiler által a kód megjegyzésére használt makrók szabványos C++ makrók. Ezeket minden olyan eszköznek megfelelően fel kell ismernie, amely képes a C++ kód elemzésére. A Q_OBJECT makró hozzáadásával a programozó több függvény deklarációját adja hozzá.

A QObject osztály a Q_OBJECT makró jelenlétében a következőket támogatja:

  1. metaobjektum információ. Információkat tartalmaz az osztályok öröklődéséről, amely lehetővé teszi annak meghatározását, hogy az osztályok közvetlen leszármazottak-e, valamint megtudhatja az osztály nevét. Az osztály meta-metódusairól (jelek, helyek és más, a Q_INVOKABLE makróval hívott függvények) vonatkozó információk is rendelkezésre állnak.
  2. Dinamikus öntés a qobject_cast() segítségével a QObject osztályokhoz. A qobject_cast() függvény a szabványos C++-hoz hasonlóan viselkedik, dynamic_cast()azzal az előnnyel, hogy nem igényel RTTI-támogatást, és a dinamikus könyvtári határokon átnyúlóan működik. A függvény megpróbálja az argumentumát a szögletes zárójelben megadott mutatótípusra leadni, és egy nem nulla mutatót ad vissza, ha az objektum megfelelő típusú (futás közben meghatározva), vagy nullptrha az objektum típusa nem kompatibilis.
  3. Időzítő, és ennek megfelelően az eseményhurok. Ezenkívül van egy szűrőmechanizmus az eseményadatok elfogására.
  4. Lehetőség az alkalmazás nemzetközivé tételére a QObject::tr() és QObject::trUtf8() metódusokkal.
  5. Támogatás a jelekhez és slotokhoz, amelyek a lazán csatolt objektumok közötti kommunikációra szolgálnak.
  6. Tulajdonságok támogatása a Qt objektumokról nem C++ kódból, például QML-ből vagy Qt Scriptből származó információk beszerzéséhez.

A meta-objektum rendszerek használata némi kritikán esett át. A Qt dokumentációja több érvet is felhozott a meta-objektum rendszerek mellett, ideértve a kódgenerálás előnyeit, a dinamikus grafikus felhasználói felületeket, a szkriptnyelvekhez való automatikus kapcsolódást korlátozások hozzáadása nélkül, valamint a moc jelek és slot-mechanizmusok ugyanolyan jó teljesítményét. [3] [4]

Linkek

  1. A metaobjektum rendszer - QtCore 5.1 . Qt Project (2013. július 4.). Letöltve: 2013. július 4. Az eredetiből archiválva : 2013. augusztus 26..
  2. A Meta-Object Compiler (moc) használata . Qt Project (2013. július 4.). Letöltve: 2013. július 4. Az eredetiből archiválva : 2013. augusztus 26..
  3. Miért használja a Qt a Moc-ot jelekhez és slotokhoz? . Qt Project (2013. július 4.). Letöltve: 2013. július 4. Az eredetiből archiválva : 2013. október 20..
  4. A Qt moc újbóli megvalósítása a libclang segítségével . Olivier Goffart (2013. július 4.). Letöltve: 2013. július 4. Az eredetiből archiválva : 2013. július 15.