Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

Custom Type Example

Files:

The Custom Type example shows how to integrate a custom type into Qt's meta-object system.

Contents:

Overview

Qt provides a range of standard value types that are used to provide rich and meaningful APIs. These types are integrated with the meta-object system, enabling them to be stored in QVariant objects, written out in debugging information and sent between components in signal-slot communication.

Custom types can also be integrated with the meta-object system as long as they are written to conform to some simple guidelines. In this example, we introduce a simple Message class, we describe how we make it work with QVariant, and we show how it can be extended to generate a printable representation of itself for use in debugging output.

The Message Class Definition

The Message class is a simple value class that contains two pieces of information (a QString and a QStringList), each of which can be read using trivial getter functions:

 class Message
 {
 public:
     Message();
     Message(const Message &other);
     ~Message();

     Message(const QString &body, const QStringList &headers);

     QString body() const;
     QStringList headers() const;

 private:
     QString m_body;
     QStringList m_headers;
 };

The default constructor, copy constructor and destructor are all required, and must be public, if the type is to be integrated into the meta-object system. Other than this, we are free to implement whatever we need to make the type do what we want, so we also include a constructor that lets us set the type's data members.

To enable the type to be used with QVariant, we declare it using the Q_DECLARE_METATYPE() macro:

 Q_DECLARE_METATYPE(Message);

We do not need to write any additional code to accompany this macro.

To allow us to see a readable description of each Message object when it is sent to the debug output stream, we define a streaming operator:

 QDebug operator<<(QDebug dbg, const Message &message);

This facility is useful if you need to insert tracing statements in your code for debugging purposes.

The Message Class Implementation

The implementation of the default constructor, copy constructor and destructor are straightforward for the Message class:

 Message::Message()
 {
 }

 Message::Message(const Message &other)
 {
     m_body = other.m_body;
     m_headers = other.m_headers;
 }

 Message::~Message()
 {
 }

The streaming operator is implemented in the following way:

 QDebug operator<<(QDebug dbg, const Message &message)
 {
     QStringList pieces = message.body().split("\r\n", QString::SkipEmptyParts);
     if (pieces.isEmpty())
         dbg.nospace() << "Message()";
     else if (pieces.size() == 1)
         dbg.nospace() << "Message(" << pieces.first() << ")";
     else
         dbg.nospace() << "Message(" << pieces.first() << " ...)";
     return dbg.maybeSpace();
 }

Here, we want to represent each value depending on how many lines are stored in the message body. We stream text to the QDebug object passed to the operator and return the QDebug object obtained from its maybeSpace() member function; this is described in more detail in the Creating Custom Qt Types document.

We include the code for the getter functions for completeness:

 QString Message::body() const
 {
     return m_body;
 }

 QStringList Message::headers() const
 {
     return m_headers;
 }

With the type fully defined, implemented, and integrated with the meta-object system, we can now use it.

Using the Message

In the example's main() function, we show how a Message object can be printed to the console by sending it to the debug stream:

     Message message(body, headers);
     qDebug() << "Original:" << message;

You can use the type with QVariant in exactly the same way as you would use standard Qt value types. Here's how to store a value using the QVariant::setValue() function:

     QVariant stored;
     stored.setValue(message);

Alternatively, the qVariantFromValue() and qVariantSetValue() functions can be used if you are using a compiler without support for member template functions.

The value can be retrieved using the QVariant::value() member template function:

     Message retrieved = stored.value<Message>();
     qDebug() << "Retrieved:" << retrieved;
     retrieved = qVariantValue<Message>(stored);
     qDebug() << "Retrieved:" << retrieved;

Alternatively, the qVariantValue() template function can be used if you are using a compiler without support for member template functions.

Further Reading

The custom Message type can also be used with direct signal-slot connections; see the Custom Type Sending Example for a demonstration of this. To register a custom type for use with queued signals and slots, such as those used in cross-thread communication, see the Queued Custom Type Example.

More information on using custom types with Qt can be found in the Creating Custom Qt Types document.

Publicité

Best Of

Actualités les plus lues

Semaine
Mois
Année
  1. « Quelque chose ne va vraiment pas avec les développeurs "modernes" », un développeur à "l'ancienne" critique la multiplication des bibliothèques 80
  2. Apercevoir la troisième dimension ou l'utilisation multithreadée d'OpenGL dans Qt, un article des Qt Quarterly traduit par Guillaume Belz 0
  3. Les développeurs ignorent-ils trop les failles découvertes dans leur code ? Prenez-vous en compte les remarques des autres ? 17
  4. BlackBerry 10 : premières images du prochain OS de RIM qui devrait intégrer des widgets et des tuiles inspirées de Windows Phone 0
  5. Quelles nouveautés de C++11 Visual C++ doit-il rapidement intégrer ? Donnez-nous votre avis 10
  6. Adieu qmake, bienvenue qbs : Qt Building Suite, un outil déclaratif et extensible pour la compilation de projets Qt 17
  7. 2017 : un quinquennat pour une nouvelle version du C++ ? Possible, selon Herb Sutter 6
Page suivante

Le Qt Developer Network au hasard

Logo

Combiner licence, à propos et fermer d'une dernière manière

Le Qt Developer Network est un réseau de développeurs Qt anglophone, où ils peuvent partager leur expérience sur le framework. Lire l'article.

Communauté

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt 4.6
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
 
 
 
 
Partenaires

Hébergement Web