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 :

Problème de slot avec un QLabel


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut Problème de slot avec un QLabel
    Salut les gens, voilà je commence à utiliser QT, et déjà j'ai un problème en voulant utiliser les slots; dans mon application de test, je veux en cliquant sur un bouton mettre à jour un QLabel, un truc que j'arrive trés bien à faire en Java avec Swing, là mon programme ne réagit pas, pourtant j'ai aucune erreur de compilation.

    Voilà mon code:
    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
    # include <QApplication>
    # include <QString>
    # include <QPushButton>
    # include <QLabel>
    # include <QVBoxLayout>
    # include <QWidget>
     
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        QPushButton *quit = new QPushButton("Hello world");
        QLabel *label = new QLabel("Label");
        QVBoxLayout *layout = new QVBoxLayout();
        QWidget *widget = new QWidget();
     
        quit->resize(300, 40);
        //quit->setFont(QFont("Arial", 18, QFont::Bold));
        //QObject::connect(quit, SIGNAL(clicked()), &app, SLOT(quit()));
        QObject::connect(quit, SIGNAL(clicked()), label, SLOT(setText(QString("test"))));
     
        layout->addWidget(quit);
        layout->addWidget(label);
     
        widget->setLayout(layout);
        widget->show();
     
        return app.exec();
    }
    Vous saurez me dire pourquoi le connect entre le bouton quit et app pour quitter fonctionne, et pas le connect avec mon QLabel ?
    J'utilise QT 4, si besoin de plus d'infos demandez moi

    Merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Je pense que c'est parce que ta fonction "setText" n'est pas définie avec le mot clé "SLOT" dans ta classe.
    Je ne crois pas que tu puisse l'utiliser directement, à mon avis, il faudrai que tu déclare une fonction à toi type SLOT dans ta classe, que tu connecte à ton widget, et qui appelle setText.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    QT arrive avec une doc plutôt bien faite.

    Peux-tu me citer où tu as trouvé ta manière de connecter ton bouton ?

    Regarde les didacticiels fournis, les exemples, ("regarde" signifie "cherche à comprendre", pas "recopie bêtement"), ne programme pas au hasard comme tu l'a fait, ou tu n'obtiendras rien de bon et tu perdras beaucoup de temps.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Attention, quand tu connectes un signal à un signal ou un slot, il faut qu'ils aient le même nombre d'arguments. Or dans ton cas, tu connectes un signal clicked() à un solt qui prend un argument, et cela, ce n'est pas possible. D'ailleurs, si tu as lancé le prg à partir d'une console, connect t'auras donné une erreur de connexion.
    SLOT() est une macro qui transforme ta fonction en texte, en fait.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Dans la doc de QLabel j'ai lu ça:
    Public Slots

    * void clear ()
    * void setMovie ( QMovie * movie )
    * void setNum ( int num )
    * void setNum ( double num )
    * void setPicture ( const QPicture & picture )
    * void setPixmap ( const QPixmap & )
    * void setText ( const QString & )
    Donc pour moi mon connect me paraissait bon car je ne connaissais pas la règle du même nombre d'arguments, et non thewho je ne code pas au hasard, j'ai cherché à comprendre ce que je faisais, j'ai pas fait du copier/coller.

    Bon si j'ai bien suivi pour faire ce que je voudrais, soit je fais une classe héritant de QLabel avec un slot setText qui ne prend aucun argument, mais dans ce cas je vais devoir mettre la chaine en dur dans ce slot, donc c'est pas génial.

    En fait je devrais faire une classe héritant de QPushButton qui redéfinit le slot clicked, mais je trouve ça un peu gros juste pour faire ce que je demande..
    Y'a un autre moyen d'après vous ?

    Merci

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, utiliser QSignalMapper.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par Zec Merquise
    et non thewho je ne code pas au hasard, j'ai cherché à comprendre ce que je faisais, j'ai pas fait du copier/coller.
    Je n'ai pas dit que tu as fait du copier/coller, en tout cas, pas à partir des didacticiels et/ou exemples de QT, car je répète ma question:

    Peux-tu me citer où tu as trouvé ta manière de connecter ton bouton ?

    Si cela avait une chance de fonctionner, comme c'est primaire comme utilisation ("primaire" n'es pas péjoratif ici), nul doute que l'aide de QT aurait montré au moins un cas.

  8. #8
    Membre habitué Avatar de galak63
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 146
    Points
    146
    Par défaut
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        QObject::connect(quit, SIGNAL(clicked()), label, SLOT(setText(QString("test"))));
    tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    QObject::connect(quit, SIGNAL(clicked()), label, SLOT(setTextTest()));
     
    public slot :
     void setTextTest(){
         label->setText( "test" );
    }

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est la solution qu'il a trouvé tout seul dans son dernier message.

Discussions similaires

  1. Probléme avec un QLabel.
    Par HadJack dans le forum Qt
    Réponses: 5
    Dernier message: 23/09/2009, 16h47
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 11h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 19h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 17h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 11h18

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