Meta-objektijärjestelmä

Qt-kehyksen meta -objektijärjestelmä tukee C++-kielen lisäominaisuuksia, joita tarvitaan itsetutkiskelua ja pohdintaa varten tarjoamalla QObject-luokan, jossa on joitain toimintoja perustana. Itse asiassa suurin osa Qt:n luokista on tämän luokan jälkeläisiä ja toteuttaa tämän järjestelmän. [yksi]

Toteutus

Meta-objektijärjestelmä sisältää: QObject-luokan, moc-apuohjelman (Meta-Object Compiler) ja valinnaisen Q_OBJECT-makron.

  1. QObject on kaikkien Qt-luokkien perusluokka
  2. Meta-objektin kääntäjä tarjoaa jokaiselle QObject-alaluokalle tarvittavan C++-koodin meta-objektin ominaisuuksien toteuttamiseksi, riippuen Q_OBJECT-makron olemassaolosta tai puuttumisesta. Kääntäjä ei muuta lähdetiedostoa, vaan luo jokaiselle näistä luokista erilaisen sisältävän meta-objektikoodin.
  3. Q_OBJECT-makro vaatii meta-objektin kääntäjä. Löytämällä tämän makron lähdekoodista kääntäjä ilmoittaa joitain toimintoja, jotka ovat välttämättömiä sisäisen tilan analysointiin ja jotka tulee toteuttaa jokaisessa QObject-alaluokassa : metaObject(), tr(), qt_metacall() ja jotkut muut. [2]

On hyväksyttävää käyttää QObjectia perusluokkana ilman Q_OBJECT-makroa ja meta-objektikoodia. Tässä tapauksessa signaalit ja paikat tai muut alla kuvatut ominaisuudet eivät kuitenkaan ole käytettävissä. Meta-objektijärjestelmän näkökulmasta QObjectin alaluokka ilman metakoodia on sama kuin sen lähin esi-isä meta-objektikoodilla. Tämä tarkoittaa, että QMetaObject::className() ei palauta luokkasi todellista nimeä, vaan sen esi-isän luokan nimeä.

Makrot, joita Meta-Object Compiler käyttää koodin merkitsemiseen, ovat tavallisia C++-makroja. Minkä tahansa C++-koodin jäsentämiseen kykenevän työkalun tulee tunnistaa ne oikein. Lisäämällä Q_OBJECT-makron ohjelmoija lisää useiden funktioiden ilmoitukset.

QObject-luokka, kun Q_OBJECT-makro on läsnä, tukee:

  1. metaobjektitiedot. Se sisältää tietoa luokkien periytymisestä, jonka avulla voit määrittää, ovatko luokat suoria jälkeläisiä, sekä selvittää luokan nimen. Saatavilla on myös tietoa luokan metamenetelmistä (signaalit, aikavälit ja muut kutsutut funktiot Q_INVOKABLE-makrolla).
  2. Dynaaminen suoratoisto qobject_cast():lla QObject-luokille. Funktio qobject_cast() toimii samalla tavalla kuin tavallinen C++ dynamic_cast(), ja sen etuna on, että se ei vaadi RTTI-tukea ja toimii yli dynaamisten kirjastorajojen. Funktio yrittää heittää argumenttinsa kulmasulkeissa määritettyyn osoitintyyppiin ja palauttaa ei-nollaosoittimen, jos objekti on oikeaa tyyppiä (määritetty suoritusaikana) tai nullptrjos objektin tyyppi ei ole yhteensopiva.
  3. Ajastin ja vastaavasti tapahtumasilmukka. Lisäksi on olemassa suodatusmekanismi tapahtumatietojen sieppaamiseksi.
  4. Kyky kansainvälistää sovellus käyttämällä QObject::tr()- ja QObject::trUtf8()-menetelmiä.
  5. Tuki signaaleille ja aikaväleille, joita käytetään kommunikoimaan löyhästi kytkettyjen objektien välillä.
  6. Tuki ominaisuuksille, joilla saadaan tietoa Qt-objekteista ei-C++-koodista, kuten QML tai Qt Script.

Meta-objektijärjestelmien käyttöä on kritisoitu jonkin verran. Qt-dokumentaatio on esittänyt useita argumentteja meta-objektijärjestelmien puolesta, mukaan lukien koodin luomisen edut, dynaamiset graafiset käyttöliittymät, automaattinen linkitys komentosarjakieliin ilman rajoituksia sekä mocin signaalien ja paikkamekanismien yhtä hyvä suorituskyky. [3] [4]

Linkit

  1. Meta-Object System - QtCore 5.1 . Qt-projekti (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 26. elokuuta 2013.
  2. Meta-Object Compilerin (moc) käyttäminen . Qt-projekti (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 26. elokuuta 2013.
  3. Miksi Qt käyttää Mocia signaaleihin ja sloteihin? . Qt-projekti (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 20. lokakuuta 2013.
  4. Qt mocin käyttöönotto uudelleen käyttämällä libclangia . Olivier Goffart (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 15. heinäkuuta 2013.