[Qt] TD3

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [Qt] TD3

Message  justblaze le Sam 26 Fév 2011, 11:13

Bonjour,

J'ai un petit souci concernant l'observateur proposition du jeu du pendu, au niveau de l'affichage des lettres déjà proposées par l'utilisateur. La méthode utilisée est la suivante:
Code:
set<char> lettreProposee() const;
J'ai donc fait ceci pour récupérer ces lettres et les afficher
Code:
std::string lettresP(obsPendu->lettreProposee().begin(),obsPendu->lettreProposee().end());
QString letrPropo = QString::fromStdString(lettresP);
Mais j'ai une erreur à l'exécution. J'utilise QtCreator sous linux, donc à l'exécution lorsque j'active l'observateur proposition la fenêtre principale noircie. Je dois surement me tromper au niveau de la récupération des lettres mais j'ai du mal à trouver mon erreur Mad

Je rajoute en plus le code de l'observateurProposition (h et cpp)
Code:
#ifndef OBSERVATEURPROPOSITION_H
#define OBSERVATEURPROPOSITION_H

#include <QLabel>

#include "O_SDO/observateur.h"

class QCloseEvent;
class Pendu;

class ObservateurProposition : public QLabel, public Observateur
{
    Q_OBJECT

private:
    Pendu * obsPendu;

public:
    ObservateurProposition(Pendu * obs);
    ~ObservateurProposition();
    void rafraichir(SujetDObservation * sdo);
    void closeEvent(QCloseEvent *);

signals:
    void masque();
};

#endif // OBSERVATEURPROPOSITION_H

Code:
#include <QCloseEvent>
#include <QString>
#include <QFont>
#include <string>

#include "ObservateurProposition.h"
#include "moteur/pendu.h"

using namespace std;

ObservateurProposition::ObservateurProposition(Pendu * obs) : obsPendu(obs)
{
    Qt::WindowFlags flags = 0;
    flags |= Qt::CustomizeWindowHint;
    flags |= Qt::WindowTitleHint;

    this->setWindowTitle("Les propositions...");
    this->setWindowFlags(flags);

    obsPendu->attacher(this);
    rafraichir(obsPendu);
}

ObservateurProposition::~ObservateurProposition()
{
    obsPendu->detacher(this);
}

void ObservateurProposition::rafraichir(SujetDObservation * sdo)
{
    if(sdo == obsPendu)
    {
        QString mot = QString::fromStdString(obsPendu->motEnCours());
        QString vie = QString::number(obsPendu->vie());
        /*std::string lettresP(obsPendu->lettreProposee().begin(),obsPendu->lettreProposee().end());
        QString letrPropo = QString::fromStdString(lettresP);*/
        QString etat = "En cours ...";
        QString message;
        QFont police("Andale Mono",11);

        if(obsPendu->gagne() == false && obsPendu->fini() == false)
            message = "<p>Proposition en cours :</p><p>"+mot+"</p><p>Essai(s) restant(s) :</p><p>"+vie+"</p>"; //<p>Lettre(s) proposée(s) :</p><p>"+letrPropo+"</p><p>"+etat+"</p>"
        else
        {
            if(obsPendu->gagne())
            {
                etat = "<strong><font color=\"green\">Fini : Vous avez gagnez !</font></strong>";
                message = "<p>Proposition en cours :</p><p>"+mot+"</p><p>Essai(s) restant(s) :</p><p>"+vie+"</p>"; //<p>Lettre(s) proposée(s) :</p><p>"+letrPropo+"</p><p>"+etat+"</p>"
            }
            else
            {
                if(obsPendu->fini() && obsPendu->gagne() == false && obsPendu->vie() == 0)
                {
                    QString motTrouve = QString::fromStdString(obsPendu->solution());
                    etat = "<p><strong><font color=\"red\">Fini : Vous avez perdu !</font></strong></p><p>Le mot à trouver était :</p><p><strong><font color=\"red\">"+motTrouve+"</font></strong></p>";
                    message = "<p>Proposition en cours :</p><p>"+mot+"</p><p>Essai(s) restant(s) :</p><p>"+vie+"</p>"; //<p>Lettre(s) proposée(s) :</p><p>"+letrPropo+"</p><p>"+etat+"</p>"
                }
            }
        }

        setText(message);
        setFont(police);
        setAlignment(Qt::AlignCenter);
    }
}

void ObservateurProposition::closeEvent(QCloseEvent * e)
{
    emit masque();
    e->accept();
}


Dernière édition par justblaze le Sam 26 Fév 2011, 19:38, édité 3 fois

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  smb le Sam 26 Fév 2011, 13:12

Quand tu mets en commentaire la récupération des lettres proposées il n'y a pas de problème Question

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  justblaze le Sam 26 Fév 2011, 14:28

smb a écrit:Quand tu mets en commentaire la récupération des lettres proposées il n'y a pas de problème Question
Aucun problème, la fenêtre s'affiche bien.
Est-ce que cela vient du faite que _lettreProposee est initialement vide Question car je tente quand même un affichage des lettres proposées Exclamation Exclamation

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  smb le Sam 26 Fév 2011, 14:44

C'est simple à vérifier : il suffit d'ouvrir l'observateur après avoir proposé une ou deux lettres !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  justblaze le Sam 26 Fév 2011, 14:53

smb a écrit:C'est simple à vérifier : il suffit d'ouvrir l'observateur après avoir proposé une ou deux lettres !
C'est une solution mais si on veut ouvrir directement cette fenêtre lorsque la partie est lancée on ne pourra pas ! En faite il suffit de rajouter une condition, c'est à dire tester si le container _lettreProposee est vide ou pas, et en fonction de cela on fait ce qu'il faut, et ça marche cheers
Code:
QString letrPropo = "";

if(!obsPendu->lettreProposee().empty())
{
    std::string lettresP(obsPendu->lettreProposee().begin(),obsPendu->lettreProposee().end());
    letrPropo = QString::fromStdString(lettresP);
}

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  smb le Sam 26 Fév 2011, 14:55

Je te signale que je ne t'ai pas proposé une solution mais une vérification !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  justblaze le Sam 26 Fév 2011, 14:58

smb a écrit:Je te signale que je ne t'ai pas proposé une solution mais une vérification !
Embarassed trop rapide dans la lecture Razz

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  justblaze le Sam 26 Fév 2011, 18:33

Rolling Eyes je reviens encore avec le même problème ..
Code:
std::string lettresP(obsPendu->lettreProposee().begin(),obsPendu->lettreProposee().end());
letrPropo = QString::fromStdString(lettresP);
Lorsque je supprime ces 2 lignes, l'application fonctionne correctement. J'arrive à jouer, gagner et perdre sans que l'application se fige. D'où vient le problème Question aucune idée ... Pourtant j'utilise bien le constructeur de string prenant en paramètres les 'iterator' de début et de fin du container _lettreProposee, que je transforme en QString par la suite avec la bonne méthode 'fromStdString(...)' !!

EDIT: Solution finale
Code:
std::set<char> restantes = obsPendu->lettreRestante();
std::string strRes(restantes.begin(),restantes.end());
QString lettresR = QString::fromStdString(strRes);
std::set<char> proposees = obsPendu->lettreProposee();
std::string strPro(proposees.begin(),proposees.end());
QString lettresP = QString::fromStdString(strPro);
et hop tout fonctionne correctement..

justblaze

Nombre de messages : 159
Age : 30
Prénom : Ismael
Statut : Etd 3R11
Localisation : Wolu. St. Lambert
Date d'inscription : 09/11/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  nvs le Sam 26 Fév 2011, 19:44

justblaze a écrit: Rolling Eyes je reviens encore avec le même problème ..
Code:
std::string lettresP(obsPendu->lettreProposee().begin(),obsPendu->lettreProposee().end());
letrPropo = QString::fromStdString(lettresP);
Lorsque je supprime ces 2 lignes, l'application fonctionne correctement. J'arrive à jouer, gagner et perdre sans que l'application se fige. D'où vient le problème Question aucune idée ... Pourtant j'utilise bien le constructeur de string prenant en paramètres les 'iterator' de début et de fin du container _lettreProposee, que je transforme en QString par la suite avec la bonne méthode 'fromStdString(...)' !!
le temps que je poste ma réponse tu sembles avoir trouvé l'origine du problème. et oui, tu utilise[s] bien le constructeur de string prenant en paramètres les 'iterator' de début et de fin du container _lettreProposee, que [tu] transforme[s] en QString par la suite avec la bonne méthode 'fromStdString(...)' mais le gros problème, c'est que lors de la construction de la string, les itérateurs de début et de fin sont ceux de deux sets différents ! et donc ça ne fonctionne pas. si la méthode lettreProposee retournait un const set<char> &, ça l'aurait fait, mais pas avec un set<char>.





Neutral

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  smb le Sam 26 Fév 2011, 21:57

Très fin !!!

... belle question à mettre dans un code d'une future évaluation Wink

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  mvh le Sam 26 Fév 2011, 23:21

smb a écrit:Très fin !!! ... Wink
Et ... notre bon SMB de se prendre pour Maître Capello ... sur l'action Wink

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  jonas le Lun 28 Fév 2011, 20:09

C'était donc ça !

Difficile à deviner quand on n'a pas encore eu le coup...

jonas

Nombre de messages : 234
Prénom : Jonathan
Statut : Ancien industrialisé
Localisation : Devant son clavier BÉPO !
Date d'inscription : 29/09/2008

http://www.xax.be

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  mvh le Lun 28 Fév 2011, 21:07

jonas a écrit:C'était donc ça !

Difficile à deviner quand on n'a pas encore eu le coup...
... usage de la violence comme nouvelle méthodologie pédagogique ... un enseignement frappant du capaes ?

_________________

La fête c'est nul sans Kidibul !
... (vieux proverbe local)



mvh

Nombre de messages : 5973
Age : 104
Prénom : Marcel VANHAELEN
Statut : (fin de bail)
Win 3.1 à reprendre
Localisation : Koekeliek de Baselberg
Date d'inscription : 06/12/2006

Revenir en haut Aller en bas

resolu Re: [Qt] TD3

Message  Contenu sponsorisé Aujourd'hui à 18:57


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum