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

Discussion :

Signal mapped() de QSignalMapper

  1. #1
    Candidat au Club
    Homme Profil pro
    manager
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Signal mapped() de QSignalMapper
    Bonjour, tout le monde.

    Je vous expose mon problème:

    Je fais actuellement un petit programme pour m'exercer en C++ et Qt, qui affiche dans une fenetre une phase de combat entre plusieurs personnages.

    Ma classe Personnage hérite de QObject et comporte donc des attributs de différents type, QString, int... et une class fenêtre qui affiche les stats des personnages ainsi que la phase de combat via un QTextEdit. dans cette fenêtre j'ai un QPushButton "attaquer" qui ouvre une fenêtre de ciblage, qui initialise via une boucle plusieurs QPushButton selon le nombre de personnages présents dans la phase de combats.

    Dans ma boucle, je créé donc les boutons ayant pour nom, le nom des différents personnage. puis j'applique un QSignalMapper à mes boutons.

    En sortant de la boucle je connecte donc mon QSignalMapper a ma fonction attaquer de la classe personnage, mais voila cette fonction prend en paramètre un pointeur personnage.

    ma question: Dois-je créer une classe héritant de QSignalMapper pour créer un signal: mapped(Personnage*)? ou existe-t-il une meilleure facon de faire?

    J'espère avoir été assez précis dans ce que je voulais, j'ai chercher un peu partout comment je pouvais procéder en vain, donc si vous avez à la limite un lien que je pourrais utiliser.

    le code de ma boucle :
    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
     
    signalMapAlliee = new QSignalMapper(this);
    for (int i =0; i < m_alliee->size(); ++i)
    {
        personnageTemp = new Personnage;
        personnageTemp = m_alliee->at(i);
        QString nom = personnageTemp->getNom();
        cibleAlliee[i] = new QPushButton(nom);
        cibleAlliee[i]->setFixedWidth(150);
        cibleAlliee[i]->setFlat(true);
        groupCibleAlliee->addButton(cibleAlliee[i]);
        layoutCibleAlliee->addWidget(cibleAlliee[i]);
        connect(cibleAlliee[i], SIGNAL(clicked()), signalMapAlliee, SLOT(map()));
        signalMapAlliee->setMapping(cibleAlliee[i], m_alliee->at(i));
    }
    connect(signalMapAlliee, SIGNAL(mapped(Personnage*)), m_personnage, SLOT(attaquer(Personnage*)));

    Merci d'avance, etant débutant je suis sur que ce n'est pas si compliquer que ca.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ta classe Personnage héritant de QObject, tu peux te servir du signal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void QSignalMapper::mapped(QObject * object)
    Il te faudra alors modifier la signature de ton slot attaquer() pour faire passer à la place un pointeur sur QObject pour correspondre au signal précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Personnage::attaquer(QObject * object)
    Il te suffira alors d'utiliser qobject_cast dedans pour récupérer le personnage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage *perso = qobject_cast<Personnage *>(object);
    Remarque complémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        personnageTemp = new Personnage;
        personnageTemp = m_alliee->at(i);
    Attention tu as une fuite de mémoire ici : le personnage alloué à la première ligne ne sera jamais delete. Récupérant un personnage déjà créé et contenu dans m_allie juste après, supprime cette première ligne qui ne sert à rien.

  3. #3
    Candidat au Club
    Homme Profil pro
    manager
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : manager

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup winjerome. Ca fonctionne! Merci aussi pour la fuite de memoire, je pensais devoir initialiser mon pointeur avec new pour y copier la classe dedans.
    C'est cool, encore merci!

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2008, 11h21
  2. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 09h57
  3. Editeur de MAP en delphi pour jeux directX
    Par PetitScorpion dans le forum DirectX
    Réponses: 5
    Dernier message: 09/07/2002, 19h47

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