IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Container de différents types particuliers


Sujet :

Qt

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut Container de différents types particuliers
    Salut à tous,

    Je possède un certain nombre de types particuliers (dont des enums et des structs déclarées en C).

    J'aimerais savoir s'il était possible de créer un container (genre QList) qui peut contenir des types différents (int, double, string, types perso).

    Pour les types prédéfinis, une QList de QVariant fait l'affaire. Cependant, pour les enums, même si l'ajout à la liste est possible grâce à QVariant, lorsque j'essaie d'en obtenir la valeur, la valeur est érronée (valeur modifiée).

    J'ai même essayé d'utiliser qRegisterMetaType, mais cela n'arrange pas le problème.

    Je n'ai pas encore essayé avec les structs.

    Si vous avez des idées ou des solutions pour ce genre de problématiques, je suis preneur. (Il y a peut être mieux à utiliser qu'une QList de QVariant).

    Merci d'avance,

    G.

    XP, Qt 4.4.0

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Bon, j'ai trouvé une solution peu pratique : ajouté tous les membres de ma structure séparément dans la liste.

    Sinon, j'ai essayé de testé des QVariant::setValue, car dans la doc de Qt, il y a des exemples permettant d'associer des structures personnelles à des QVariant. Cependant, ça n'a pas l'air de marcher pour les enums.

    Voici un code simplifié, avec quelques commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <QApplication>
    #include <QList>
    #include <QtDebug>
    #include <QVariant>
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    	QVariant variant;
    	QList<QVariant> qlist;
     
    	enum monEnum{
    		value1 = 14,
    		value2 = 5,
    		value3 = 48
    	};
     
    	monEnum enum1;
    	//variant.setValue(enum1);  //Cette fonction empêche la compilation(message d'erreur plus bas)
    	//qlist.append(variant);  //variant n'étant pas résolu, je ne peux l'ajouter 
     
    	qlist.append(enum1); //l'ajout sans passage intermédiaire ne provoque pas d'erreur
     
    	//monEnum enum2 = qlist.takeFirst().value<monEnum>();  // ici la même erreur que lorsque je fais le setValue() (message d'erreur plus bas)
     
    	//qDebug() <<qlist.takeFirst();  //retourne une valeur érronée : "QVariant(int, 4223276)"
     
    	exit(0);
    	return app.exec();
    }
    Voici le type d'erreur que me retourne la compilation (VS 2008) lors de la "conversion" monEnum<-> QVariant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    c:\qt\qt4.4.0\include\qtcore\../../src/corelib/kernel/qmetatype.h(191) : error C2039: 'qt_metatype_id'*: n'est pas membre de 'QMetaTypeId<T>'
            with
            [
                T=main::monEnum
            ]
            c:\qt\qt4.4.0\include\qtcore\../../src/corelib/kernel/qmetatype.h(191)*: lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
            c:\qt\qt4.4.0\include\qtcore\../../src/corelib/kernel/qmetatype.h(201)*: voir la référence à l'instanciation de la classe modèle 'QMetaTypeId2<T>' en cours de compilation
            with
            [
                T=main::monEnum
            ]
            c:\qt\qt4.4.0\include\qtcore\../../src/corelib/kernel/qvariant.h(442)*: voir la référence à l'instanciation de la fonction modèle 'int qMetaTypeId<T>(T *)' en cours de compilation
            with
            [
                T=main::monEnum
            ]
            c:\qt\qt4.4.0\include\qtcore\../../src/corelib/kernel/qvariant.h(490)*: voir la référence à l'instanciation de la fonction modèle 'void qVariantSetValue<T>(QVariant &,const T &)' en cours de compilation
            with
            [
                T=main::monEnum
            ]
            .\main.cpp(19)*: voir la référence à l'instanciation de la fonction modèle 'void QVariant::setValue<main::monEnum>(const T &)' en cours de compilation
            with
            [
                T=main::monEnum
            ]

    Merci pour vos commentaires.

    G.

  3. #3
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Je t'avouerais ne pas avoir tester avec des enums, mais à partir de la page cours et tutoriels pour apprendre Qt, as-tu suivi toutes les étapes de ce tuto ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Merci pour le lien !

    Il me manquait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Q_DECLARE_METATYPE(monEnum);
    Avec ça, ça passe comme papa dans maman.

    Merci !

    G.

  5. #5
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Et c'est Gulish qui décroche le point Finesse du jour!

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/04/2007, 21h17
  2. Réponses: 5
    Dernier message: 11/09/2006, 18h29
  3. Affichage de listes de différents types
    Par thibouille dans le forum C++
    Réponses: 9
    Dernier message: 27/11/2005, 20h34
  4. différents types de bases de données
    Par Alvergnat dans le forum Access
    Réponses: 2
    Dernier message: 18/06/2005, 18h06
  5. Réponses: 9
    Dernier message: 02/03/2005, 23h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo