Meta-objekt system

Meta-objektsystemet i Qt-rammeværket giver understøttelse af yderligere funktioner i C++-sproget , der er nødvendige for introspektion og refleksion ved at give en QObject-klasse med en vis funktionalitet som base. Faktisk er langt de fleste klasser i Qt efterkommere af denne klasse og implementerer dette system. [en]

Implementering

Meta-objektsystemet inkluderer: QObject-klassen, moc-værktøjet (Meta-Object Compiler) og den valgfri Q_OBJECT-makro.

  1. QObject er basisklassen for alle Qt-klasser
  2. Meta-objekt-kompileren forsyner hver underklasse af QObject med den nødvendige C++-kode til at implementere meta-objekt-kapaciteter, afhængigt af tilstedeværelsen eller fraværet af Q_OBJECT-makroen. Compileren ændrer ikke kildefilen, men opretter en anden indeholdende metaobjektkode for hver af disse klasser.
  3. Q_OBJECT-makroen er påkrævet af meta-objekt-kompileren. Ved at finde denne makro i kildekoden, erklærer compileren nogle funktioner, der er nødvendige for analysen af ​​den interne tilstand og skal implementeres i hver underklasse af QObject: metaObject(), tr(), qt_metacall() og nogle andre. [2]

Det er acceptabelt at bruge QObject som basisklassen uden Q_OBJECT-makroen og metaobjektkoden. Men i dette tilfælde vil hverken signaler og slots eller de andre funktioner beskrevet nedenfor være tilgængelige. Fra metaobjektsystemets synspunkt er en underklasse af QObject uden metakode den samme som dens nærmeste forfader med metaobjektkode. Dette betyder, at QMetaObject::className() ikke returnerer det faktiske navn på din klasse, men klassenavnet på den forfader.

Makroerne brugt af Meta-Object Compiler til at kommentere kode er standard C++ makroer. De bør genkendes korrekt af ethvert værktøj, der er i stand til at parse C++-kode. Ved at tilføje Q_OBJECT-makroen tilføjer programmøren erklæringen af ​​flere funktioner.

QObject-klassen, i nærvær af Q_OBJECT-makroen, indeholder understøttelse af:

  1. metaobjekt information. Den indeholder oplysninger om nedarvning af klasser, som giver dig mulighed for at afgøre, om klasser er direkte efterkommere, samt finde ud af navnet på klassen. Information om klassemetametoder (signaler, slots og andre kaldede funktioner med Q_INVOKABLE makroen) er også tilvejebragt.
  2. Dynamisk casting med qobject_cast() for QObject-klasser. Funktionen qobject_cast() opfører sig på samme måde som standard C++ dynamic_cast()med den fordel, at den ikke kræver RTTI-understøttelse og fungerer på tværs af dynamiske biblioteksgrænser. Funktionen forsøger at kaste sit argument til den pointertype, der er angivet i vinkelparenteserne, og returnerer en ikke-nul pointer, hvis objektet er af den korrekte type (bestemt under kørselstidspunktet), eller nullptrhvis objektets type er inkompatibel.
  3. Timer og dermed hændelsesløkken. Derudover er der en filtreringsmekanisme til at opsnappe hændelsesdata.
  4. Evne til at internationalisere applikationen ved hjælp af metoderne QObject::tr() og QObject::trUtf8().
  5. Understøttelse af signaler og slots, som bruges til at kommunikere mellem løst koblede objekter.
  6. Understøttelse af egenskaber for at få information om Qt-objekter fra ikke-C++-kode, såsom QML eller Qt Script.

Brugen af ​​meta-objektsystemer har været udsat for en del kritik. Qt-dokumentationen har fremført flere argumenter til fordel for meta-objektsystemer, herunder fordelene ved kodegenerering, dynamiske GUI'er, automatisk linkning til scriptsprog uden at tilføje begrænsninger og den lige så gode ydeevne af moc's signaler og slotsmekanisme. [3] [4]

Links

  1. Meta-objektsystemet - QtCore 5.1 . Qt Project (4. juli 2013). Hentet 4. juli 2013. Arkiveret fra originalen 26. august 2013.
  2. Brug af Meta-Object Compiler (moc) . Qt Project (4. juli 2013). Hentet 4. juli 2013. Arkiveret fra originalen 26. august 2013.
  3. Hvorfor bruger Qt Moc til signaler og slots? . Qt Project (4. juli 2013). Hentet 4. juli 2013. Arkiveret fra originalen 20. oktober 2013.
  4. Genimplementering af Qt moc ved hjælp af libclang . Olivier Goffart (4. juli 2013). Hentet 4. juli 2013. Arkiveret fra originalen 15. juli 2013.