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 :

QList et QVBoxLayout


Sujet :

Qt

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut QList et QVBoxLayout
    Bonjour,

    Je suis en train de réaliser un solitaire, pour se faire j'ai créer une classe carte qui hérite de QLabel et qui contient un QPixmap (ainsi que des attributs famille, couleur, etc...). J'ai aussi créer une classe conteneur pour représenter chacun des tas ou sont mis les cartes.

    Je pensais utiliser QList pour stocker la liste des cartes contenues dans chacun des conteneurs, le problème étant que je n'arrive pas à associer ma classe carte avec QList. Quelqu'un sait il comment faire pour utiliser une classe personnelle avec QList ? Elle doit avoir des pré requis ? (constructeur par copie non ? et un opérateur d'assignement mais je ne vois pas trop quoi mettre pour ma classe Carte ?!?!).

    Je voudrais aussi savoir comment faire pour mettre en forme mes cartes. J'ai essayé d'utiliser un QVBoxLayout pour disposer mes cartes mais je n'ai pas réussi à faire une marge négative pour que mes cartes se chevauchent.
    La solution que j'ai trouvé consiste à utiliser setGeometry() pour disposer mes cartes mais je dois avouer que c'est pas top.

    Merci par avance pour vos réponses.

    ++ Dgrey-man

    Edit : Finalement je vais utiliser un QVector de pointeurs de Carte à la place de QList ce qui ne m'oblige pas à réécrire le constructeur par copie ainsi que de surcharger l'opérateur d'affectation.

  2. #2
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Comme c'est indiqué dans la doc :
    - pour que ta carte soit un type acceptable par QList :
    a type must provide a default constructor, a copy constructor, and an assignment operator.
    - si tu veux pas t'embêter, tu peux aussi utiliser des pointeurs du genre
    [...Pour les items sans constructeurs par copie...]If you want to store these kinds of objects in a container, store them as pointers, for example as QList<QWidget *>.
    Je manque d'expérience en ce qui concerne l'affichage et son optimisation, je laisse des gens plus rensignés te répondre.

    Bonne chance,

    G.

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut
    Bon je dois avouer que je suis un peu perdu. Pour simplifier, pour le moment j'ai une classe Carte qui hérite de QLabel et qui contient un Pixmap qui est automatiquement assigné à la création de l'instance de la classe. (J'ai numéroté mes images de cartes de 0 à 52 et la signature du constructeur de Carte ressemble à Carte(QWidget *parent, int numero, bool visible) où visible correspond au fait si la carte est de dos ou de face).

    Maintenant j'ai une classe qui correspond au QWidget Central : "Desk" qui représente le plateau de jeu.

    J'aimerais que cette classe contienne 13 "conteneurs" pour représenter chacun des tas de cartes du plateau de jeu.

    J'ai alors créer une classe "conteneur". Je pensais utiliser un QList ou un QVector pour stocker ma collection d'instances de Carte. Le soucis c'est lorsque je crée une instance de Carte elle s'affiche automatiquement sur le plateau de jeu puisque le Pixmap est défini à la création de l'instance. (vous me suivez ?)

    Pour moi un pointeur c'est juste une adresse mémoire, donc si je fais un QList ou un QVector de pointeurs d'instances de Cartes mes conteneurs ne contiendront pas réellement mes cartes ? Elles seront affichés dans le plateau de jeu et pas dans mes conteneurs ?

    J'espère avoir été assez clair. Peut être voulez vous voir les sources pour une meilleur compréhension ?

    ++


    [Edit] : J'essaye d'avancer de tester des trucs tout seul vu que j'ai pas beaucoup de réponses. J'ai opté pour le QVector<Carte *> j'ai une fonction ajouterCarte :

    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
     
    Boite::Boite(QWidget *parent):QWidget(parent)
    {
    liste_carte = new QVector<Carte*>();
    srand(time(NULL));
    ajouterCarte(rand() % 50,false);
    ajouterCarte(rand() % 50,false);
    ajouterCarte(rand() % 50,true);
    }
     
     
    void Boite:ajouterCarte(int n,bool v) 
    {
    // n = numero de la carte
    // v = visibilité de la carte
    a = new Carte(this,n,v);
    a->setFrameShape(QFrame::Panel);
    liste_carte-> append(a);
    mainLayout->addWidget(???);
    }
    Qu'est ce que je dois mettre à la place de ??? pour accéder au deuxième élément de ma liste ? J'ai bien essayé liste_carte[1] mais il en veut pas. Pareil pour *liste_carte[1]


    [Edit2]: je crois avoir trouvé une solution qui marche je vous tiendrais au courant

  4. #4
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut, alors déjà, quelques précisions :

    la différence entre QList et QVector :
    QVector enregistre les éléments qu'il contient de façon contigüe dans la mémoire. L'intérêt est que tu peux le transformer facilement en "tableau" simple (du genre int [] ), et tu gardes la propriété des ces tableaux, à savoir que tu peux te déplacer dans la mémoire en incrémentant l'adresse, et ainsi tomber sur un autre objet de ton tableau ! (c'est pas clair, mais c'est pas simple à expliquer en 2 lignes)

    QList enregistre lui ses éléments de façon plus aléatoire, mais ce conteneur est bien plus optimisé pour ce qui est de l'ajout/insertion/suppression d'élément. Il est donc à privilégier dans 90% cas (sauf si tu as besoin des propriétés de QVector par exemple).

    Ensuite, pour accéder aux éléments de ta QList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pour ajouter : myList.append(myElement);
    pour récupérer sans retirer : myList.at(index);
    pour récupérer en retirant : myList.takeAt(index);
    Tu peux aussi utiliser l'opérateur myList[index], mais il faut être sûr que tu as déjà entrer une valeur à cet index, sinon plantage !
    Ensuite, pour ce qui est de tes cartes qui s'affichent, c'est parce qu'elles étendent QWidget, et qu'elles ont comme parent un QWidget visible ! Le plus simple serait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = new Carte(this,n,v);
    a->setFrameShape(QFrame::Panel);
    a->hide();
    Voilà pour le début, ensuite je n'ai pas trop compris si te "conteneurs" représentaient juste un conteneur d'élément, ou s'ils allaient aussi gérer l'affichage des cartes qu'ils contiennent.

    Sinon, pour réponre à ton bout de code, il suffit de remplacer ??? par "a", ou par "liste->last()".

    A noter qu'il n'est pas judicieux d'utiliser un pointeur de QList.

    Bonne chance,

    G.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    A première vue, tu as mal structuré ton projet et tu mélange ihm et coeur du jeux.
    Ce qu'il faut éviter le plus possible.
    SUr le principe, j'aurais préféré http://qt.developpez.com/doc/4.4/qstack/ au lieu d'un QVector ou QList. Mais cela va dépendre de la phase de jeux

    Pour l'affichage, les layout ne feront pas ce que tu demande. Il ne sont pas fait pour cela. Faudrait faire à la main.

    Pour l'affichage tu devrais utiliser les QGraphics*. T'auras de bien meilleur résultat.
    Petite ébauche :
    carte : class carte
    tas avec une carte retourné : class tasDeCarte avec spécialisation en fonction de ce que doit faire le tas.
    jeux : class jeux

    Ensuite la même chose pour l'affichage en se basant sur les QGraphicsItems

  6. #6
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut
    Bah on a presque rien appris sur Qt avec notre prof (le cours a duré une moitié de semestre...) et il nous demande de faire un solitaire. -_-

    J'ai fais comme j'ai pu, j'ai :

    - une classe Carte qui hérite de QLabel qui contient un Pixmap défini automatiquement à la création de la carte, ce Pixmap represente la carte ou le dos de la carte en fonction que la carte est "visible" ou non.

    - une classe Boite qui contient un QVector de pointeurs de cartes, auquel j'ajoute et je retire mes cartes.
    Une boite peut etre de type "tas" ou de type "tableau". Dans les tableaux, les cartes sont agencées à l'intérieur des Boites à l'aide de "move" et dans les tas j'utilise un QStackedLayout (ou QStackLayout je ne sais plus l'orthographe exacte).

    - une classe Desk qui représente mon plateau de jeu et qui contient 13 "Boites" agencées avec un QGridLayout.

    - une classe MainWindowImpl qui s'occupe de créer les menus, la status bar de définir le widget central etc...

    - une classe Option qui hérite d'un Qdialogue (j'ai un menu de préférences qui ouvre une nouvelle fenetre)

    Le tout commence à se tenir pas trop mal. Il me reste à mettre le Drag'n drop, et tout ce qui est relatif au jeu.

    Voilà ++


    [Edit]: Je suis en train de faire le drag'n drop, quelqu'un sait comment on recupère le nom de l'objet sur quoi on a cliqué ??? J'ai un peu cherché mais j'ai pas trouvé. Je vais continuer à chercher...

  7. #7
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4
    Par défaut
    Bon et bien voilà je bloque avec le drag 'n drop !

    Comment puis je savoir sur quoi je clique ? J'ai trouvé comment savoir où je clique mais çà me sert à rien vu que mes cartes s'adaptent automatiquement à la taille de la fenetre (et donc change de position par la même occasion).

    La première idée qui me vient en tête serait de rendre mes cartes cliquables et lorsqu'on clique dessus elle renvoie une valeur mais je n'ai pas vraiment d'idées de comment faire. Il y a pas une solution simple ?

    Le projet étant à rendre bientot je n'ai pas envi de réécrire tout mon code !

    Merci pour toute aide apportée.

  8. #8
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Aurais tu lu ça ?
    Doc du drag 'n drop

    Il ya assez d'infos et de code pour faire ce que tu veux, selon moi.

    Bonne chance,

    G.

  9. #9
    Membre très actif
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Par défaut
    Comme l'a suggéré Mongaulois, utilise plutôt QGraphicsView si tu veux moins te prendre la tête niveau IHM. (drag'n'drop adapté au contexte)

Discussions similaires

  1. ~QList() : Crash
    Par ledjlale dans le forum Qt
    Réponses: 1
    Dernier message: 22/07/2008, 20h25
  2. Problèmes avec un QVBoxLayout
    Par haraelendil dans le forum Qt
    Réponses: 4
    Dernier message: 01/07/2008, 15h04
  3. Réponses: 11
    Dernier message: 28/05/2008, 18h04
  4. "fusion" de deux QList en qt
    Par balteo dans le forum Qt
    Réponses: 14
    Dernier message: 04/04/2008, 10h53
  5. Creer une QList de struct
    Par Iaurkano dans le forum Qt
    Réponses: 3
    Dernier message: 21/03/2008, 09h06

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