Developpez.com - Rubrique Qt

Le Club des Développeurs et IT Pro

De QObject aux méta-objets

Une plongée au coeur des fondations de Qt, le tutoriel de Louis du Verdier mis à jour

Le 2010-02-09 21:39:20, par Amnell, Rédacteur
Bonjour à tous,

Les fondations de Qt constituent un sujet intéressant dans le cadre de son apprentissage. Sur quoi s’appuie réellement le framework ? Quel est son modèle objet ? Dans la majorité des cas, les développeurs utilisant Qt pour développer des interfaces graphiques ne savent pas y répondre, et c’est pour cela que j’ai décidé de rédiger un article sur ces fondations.

Cet article a pour but de traiter de QObject jusqu’aux méta-objets pour permettre à tous de mieux comprendre sur quoi est véritablement fondé Qt. L’introspection, les propriétés, les signaux, les slots et les méta-objets constituent pour vous un domaine inexploré ? L’occasion est venue d'y remédier.

De QObject aux méta-objets, une plongée au cœur des fondations de Qt

Attendiez-vous un tel article ? Vous a-t-il aidé ? N’hésitez pas à commenter !
  Discussion forum
9 commentaires
  • Tu as fait un superbe article Amnell, Bravo !

    Personnellement, tu m'as appris pas mal de chose, ce que je retiens surtout, c'est le système de méta-objets.

    Bon maintenant, est ce que ça va vraiment m'être utile ? Pas tant que ça, ce sont juste des connaissances en plus.

    Cependant, deux petites questions :

    Quand on utilise le compilateur de méta-objets (moc), si notre classe définit des méthodes templates dans les fichiers d'en-tête, est ce qu'elles sont toujours valable ?

    N'y aurait-t-il pas une erreur renvoyé par le compilateur C++, vu que ces méthodes "particulières" doivent être dans les en-têtes, et que le moc les transformes en fichiers avec l'extension .cpp ?

    Merci pour cet article Amnell. Bonne continuation.
  • Amnell
    Rédacteur
    Salut,

    Tout d'abord, merci du commentaire.
    Je vais à la suite répondre à tes deux questions :

    Envoyé par Abdelite
    Quand on utilise le compilateur de méta-objets (moc), si notre classe définit des méthodes templates dans les fichiers d'en-tête, est ce qu'elles sont toujours valable ?
    Le moc n'empêche pas l'utilisation des templates (comment fonctionnerait QList, par exemple, si c'était le cas ?), mais prive une classe template des signaux et des slots. Je t'invite à consulter cette page pour avoir la liste complète des restrictions que cause le moc.

    Envoyé par Abdelite
    N'y aurait-t-il pas une erreur renvoyé par le compilateur C++, vu que ces méthodes "particulières" doivent être dans les en-têtes, et que le moc les transformes en fichiers avec l'extension .cpp ?
    Depuis quand les fonctions template doivent-elle forcément être implémentées dans la déclaration de classe ? Ou peut-être parlais-tu d'autres fonctions ?
  • Je n'ai pas parlé des fonctions "globale" templates, encore moins des classes templates, mais des méthodes templates.

    Elles doivent être entièrement définis (prototype + corp) dans l'en-tête.
    Comme les fonctions templates tout cour, on ne les places pas dans les .cpp
  • Amnell
    Rédacteur
    Une déclaration de classe template avec dedans une méthode template (fichier header) :

    Code :
    1
    2
    3
    4
    5
    6
    7
    template <typename T>
    class MyClass
    {
    	public:
    	//...
    	T method() const; 
    };
    Et l'implémentation dans un fichier .cpp :

    Code :
    1
    2
    3
    4
    5
    template<typename T>
    T MyClass<T>::method() const
    {
    	// ...
    }
    N'y aurait-t-il pas une erreur renvoyé par le compilateur C++, vu que ces méthodes "particulières" doivent être dans les en-têtes, et que le moc les transformes en fichiers avec l'extension .cpp ?
    Comme le code donné ci-dessus fonctionne sans problème, il n'y a strictement aucun soucis, pour répondre à ta question.

    EDIT : Mais je pense qu'il n'y a aucun lien entre mon explication (sans doute erronée) et le système.
  • Merci pour ta réponse Amnell, tout est clair à présent, bonne continuation.
  • Amnell
    Rédacteur
    Bonsoir,

    Une nouvelle correction orthographique appliquée aujourd'hui.
    Merci à jacques_jean pour sa nouvelle relecture.
  • atha2
    Membre éprouvé
    Très bon article mais comme je ne fait pas de Qt en ce moment, je ne sais pas s'il me sera utile dans le futur...
    Envoyé par Amnell

    Comment utiliser l'introspection ? Cette question est celle à laquelle il me faudra répondre dans cette partie.
    La question qu'il faudrait surtout se poser c'est quand faire de l'introspection ? Perso à part faire de la bidouille et épater la galerie avec, j'ai rarement eu besoin de m'en servir. L'exemple donnée est "jolie" mais pas vraiment utile à part si on a besoin de créer un framework de test unitaire.
    Mais j'imagine qu'il doit y avoir d'autre utilisation plus pertinente et notamment dans le cadre de Qt (création d'interface graphique charger à partir d'un fichier XML par exemple ?).

    merci
  • Amnell
    Rédacteur
    Envoyé par atha2
    La question qu'il faudrait surtout se poser c'est quand faire de l'introspection ? Perso à part faire de la bidouille et épater la galerie avec, j'ai rarement eu besoin de m'en servir.
    La question est en effet très pertinente, mais j'y ajouterais le mot "explicitement", car la programmation avec Qt peut s'avérer introspective dans certains cas de figure.
    Dans la documentation, les moteurs de scripts et les constructeurs de GUI sont donnés comme exemples à l'utilisation des méta-objets.
  • Amnell
    Rédacteur
    Bonsoir,

    Une nouvelle correction a été effectuée aujourd'hui.
    Merci à Shulgin pour ses remarques et ses suggestions.