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.
- A QObject az összes Qt osztály alaposztálya
- 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.
- 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:
- 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.
- 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.
- Időzítő, és ennek megfelelően az eseményhurok. Ezenkívül van egy szűrőmechanizmus az eseményadatok elfogására.
- Lehetőség az alkalmazás nemzetközivé tételére a QObject::tr() és QObject::trUtf8() metódusokkal.
- Támogatás a jelekhez és slotokhoz, amelyek a lazán csatolt objektumok közötti kommunikációra szolgálnak.
- 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
- ↑ 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.. (határozatlan)
- ↑ 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.. (határozatlan)
- ↑ 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.. (határozatlan)
- ↑ 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. (határozatlan)
Qt |
---|
Technológia |
|
---|
Eszközök |
|
---|
Kötések |
|
---|
Kapcsolódó témák |
|
---|