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.
- QObject on kaikkien Qt-luokkien perusluokka
- 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.
- 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:
- 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).
- 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.
- Ajastin ja vastaavasti tapahtumasilmukka. Lisäksi on olemassa suodatusmekanismi tapahtumatietojen sieppaamiseksi.
- Kyky kansainvälistää sovellus käyttämällä QObject::tr()- ja QObject::trUtf8()-menetelmiä.
- Tuki signaaleille ja aikaväleille, joita käytetään kommunikoimaan löyhästi kytkettyjen objektien välillä.
- 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
- ↑ Meta-Object System - QtCore 5.1 . Qt-projekti (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 26. elokuuta 2013. (määrätön)
- ↑ Meta-Object Compilerin (moc) käyttäminen . Qt-projekti (4. heinäkuuta 2013). Haettu 4. heinäkuuta 2013. Arkistoitu alkuperäisestä 26. elokuuta 2013. (määrätön)
- ↑ 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. (määrätön)
- ↑ 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. (määrätön)
Qt |
---|
Tekniikka |
|
---|
Työkalut |
|
---|
Sidokset |
|
---|
liittyvät aiheet |
|
---|