Votre question

Problème Qt

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
13 Juin 2008 10:27:46

Bonjour tout le monde, est-ce que vous pourriez m'aider s'il vous plaît, je rencontre une petite difficulté dans un programme en Qt. Voici le code et je vous donne le problème ensuite (j'ai marqué les lgnes qui me semblent importantes pour régler le problème) :


Main.cpp
  1. #include <QApplication>
  2. #include "MaFenetre.h"
  3.  
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication app(argc, argv);
  8.  
  9. MaFenetre fenetre;
  10. fenetre.show();
  11.  
  12. return app.exec();
  13. }




MaFenetre.h :
  1. #ifndef DEF_MAFENETRE
  2. #define DEF_MAFENETRE
  3.  
  4. #include <QApplication>
  5. #include <QWidget>
  6. #include <QPushButton>
  7. #include <QLCDNumber>
  8. #include <QSlider>
  9. #include <QProgressBar>
  10.  
  11. class MyWidget : public QLCDNumber
  12. {
  13. Q_OBJECT
  14.  
  15. public :
  16. MyWidget();
  17.  
  18. public slots :
  19. void buttonClicked (); //ceci
  20.  
  21. private :
  22. QLCDNumber *m_lcd;
  23.  
  24. };
  25.  
  26. class MaFenetre : public QWidget
  27. {
  28. Q_OBJECT
  29.  
  30. public:
  31. MaFenetre();
  32.  
  33.  
  34. public slots :
  35. void changerLargeur (int largeur);
  36. void changerHauteur (int hauteur);
  37.  
  38.  
  39. private:
  40. QSlider *m_slider;
  41. QSlider *m_sliderv;
  42. QLCDNumber *m_lcd;
  43. QProgressBar *m_barre;
  44. QPushButton *m_bouton;
  45.  
  46.  
  47. };
  48.  
  49. #endif


MaFenetre.cpp :
  1. #include "MaFenetre.h"
  2.  
  3. void MaFenetre::changerHauteur (int hauteur)
  4. {
  5. setFixedSize(width(), hauteur);
  6. }
  7.  
  8. void MaFenetre::changerLargeur (int largeur)
  9. {
  10. setFixedSize(largeur, height());
  11. }
  12.  
  13. void MyWidget::buttonClicked () //ceci
  14. {
  15. m_lcd -> display (48);
  16. }
  17.  
  18.  
  19.  
  20. MaFenetre::MaFenetre() : QWidget()
  21. {
  22. setFixedSize(400, 400);
  23.  
  24. m_slider = new QSlider (Qt::Horizontal, this);
  25. m_slider -> setRange (200, 1000);
  26. m_slider -> setGeometry (10, 60, 150, 20);
  27.  
  28. m_sliderv = new QSlider (Qt::Vertical, this);
  29. m_sliderv -> setRange (200, 1000);
  30. m_sliderv -> setGeometry (160, 10, 20, 150);
  31.  
  32.  
  33. m_lcd = new QLCDNumber (1, this);
  34. m_lcd -> setSegmentStyle (QLCDNumber::Filled);
  35. m_lcd -> setGeometry (0, 0, 80, 40);
  36. m_lcd -> (12);
  37.  
  38. m_bouton = new QPushButton ("1", this);
  39. m_bouton -> setGeometry (250, 250, 20, 20);
  40.  
  41.  
  42.  
  43.  
  44. QObject::connect (m_slider, SIGNAL (valueChanged(int)), this, SLOT (changerLargeur(int)));
  45. QObject::connect (m_sliderv, SIGNAL (valueChanged(int)), this, SLOT (changerHauteur(int)));
  46. QObject::connect (m_bouton, SIGNAL (clicked()), m_lcd, SLOT (buttonClicked())); //cette ligne
  47.  
  48. }


En fait je voudrais que quand je clique sur le bouton marqué 1 ça change la valeur d'affichage sur le QLCDNumber mais ça marche pas ><. J'ai déjà cherché mais j'ai pas réussi avec ce que j'ai trouvé, donc je m'en remets à vous.

Merci d'avance pour votre aide !

Autres pages sur : probleme

a b L Programmation
13 Juin 2008 20:28:56

  1. void MyWidget::buttonClicked () //ceci
  2. {
  3. m_lcd -> display (48);
  4. }

Quand tu appuies sur le bouton tu affiches 48.

Tu veux la changer mais qu'est-ce que tu veux faire exactement?

Si c'est pour ajouter +1 à chaque clic, tu utilise une variable membre dans MyWidget que tu incrémentes et affiche à chaque clic: m_lcd->display( ++taVariable )
13 Juin 2008 21:48:00

En fait tout ce que je veux pour l'instant c'est que le QLCDNumber affiche le 48 quand je clique sur le bouton (il est à 0 quand je lance le programme), ce qui n'est pas le cas et c'est ça que je ne comprends pas, je sais pas quoi changer pour que ça marche :??: 
Merci d'avoir répondu :) 
Contenus similaires
Pas de réponse à votre question ? Demandez !
a b L Programmation
13 Juin 2008 22:47:41

Ah ok, c'est surment juste un problème de rafraichissement de l'affichage, essaie d'appeler un update:
  1. void MyWidget::buttonClicked () //ceci
  2. {
  3. m_lcd -> display (48);
  4. m_lcd->update();
  5. update();
  6. }

J'en ai trop mis mais c'est pour tester. Si ça ne marche pas essaie avec repaint(), et si ça ne marche toujours pas, c'est que ce n'est pas un problème de rafraichissement :) 

Sinon,
  1. m_lcd -> (12);
c'est quoi ça ? :) 
13 Juin 2008 23:35:31

Alors pour la ligne avec le m_lcd -> (12); c'est une bêtise que j'ai marquée parce que je testais tout et n'importe quoi quand j'ai vu que ce que j'avais fait ne marchait pas mais maintenant je l'ai enlevé, et j'ai essayé de faire update comme vous aviez proposé mais ça n'a pas marché non plus (pas plus que repaint...), donc ça ne doit pas être un problème de rafraîchissement :sweat:  ...

Voilà un des trucs que j'avais trouvés en cherchant, c'est le même problème que le mien, est-ce que ça pourrait vous aider à m'aider ?
http://www.siteduzero.com/forum-83-234999-2130576-qt4-p...
a b L Programmation
14 Juin 2008 13:18:50

non l'autre problème c'est l'erreur de mettre une valeur fixe en paramètre du slot du connect. Normalement, un slot puet être appelée comme une méthode normale.

J'ai un peu mieux regardé le code, et il y a un truc vraiment bizarre:
Dans MaFenetre, tu n'utilises jamais pas MyWidget.
Et dans ton connect, tu connectes le signal clicked du bouton de type QPushButton (ça OK) au slot buttonClicked de m_lcd de type QLCDNumber qui n'a évidemment pas de slot buttonClicked.

m_lcd doit être une instance de la classe MyWidget et pas de la classe QLCDNumber.
14 Juin 2008 14:22:37

Oui mais je crois que l'autre personne cherchait à faire la même chose que moi, c'est pour ça que je vous ai montré ça.
Je suis désolé si je suis un boulet mais je suis pas sûr d'avoir très bien compris ce que vous vouliez dire.
a b L Programmation
14 Juin 2008 15:53:29

  1. class MyWidget : public QLCDNumber
Tu as fait un héritage.
MyWidget est un nouveau widget qui contient tout ce que contient tout QLCDNumber. Donc ton MyWidget est ton widget QLCDNumber personalisé.

Donc, à l'intérieur de MyWidget, ne déclare pas "QLCDNumber *m_lcd;" car c'est maintenant MyWidget l'afficheur LCD.
Dans ce que tu as fait, MyWidget est en fait un QLCDWidget auquel tu as ajouté le slot buttonClicked().

Maintenant dans MaFenetre, si tu n'utilises que des QLCDWidget, tu n'utilises pas ton afficheur LCD perso mais celui par défaut, donc tu n'as pas le slot buttonClicked().
C'est pour ça que dans MaFenetre, tu ne doit utiliser que des MyWidget pour n'utiliser que les afficheurs LCD perso (et donc utiliser le nouveau slot).

Donc, dans la déclaration de MaFenetre, remplace QLCDNumber *m_lcd; par MyWidget *m_lcd;
Et, dans l'implémentation du constructeur de MaFenetre, remplace m_lcd = new QLCDNumber (1, this); par m_lcd = new MyWidget (1, this);

Il te faudra donc dans MyWidget faire le constructeur qui va bien pour les 2 paramètres que tu passes.
14 Juin 2008 18:17:49

Voilà ce que j'ai changé dans MaFenetre.h
  1. class MyWidget : public QLCDNumber
  2. {
  3. //ce qu'il y a après ça
  4.  
  5. Q_OBJECT
  6.  
  7. public :
  8. MyWidget::MyWidget();
  9.  
  10. public slots :
  11. void buttonClicked ();
  12.  
  13. private :
  14. MyWidget *m_lcd;
  15.  
  16. };
  17.  
  18. class MaFenetre : public QWidget
  19. {
  20. Q_OBJECT
  21.  
  22. public:
  23. MaFenetre();
  24.  
  25. public slots :
  26. void changerLargeur (int largeur);
  27. void changerHauteur (int hauteur);
  28.  
  29.  
  30. private:
  31. QSlider *m_slider;
  32. QSlider *m_sliderv;
  33. MyWidget *m_lcd; // et ça
  34. QProgressBar *m_barre;
  35. QPushButton *m_bouton;
  36.  
  37.  
  38. };


La seule chose que j'aie changée dans MaFenetre.cpp c'est ça :
  1. m_lcd = new MyWidget (1, this);
je n'ai rien fait d'autre.

Ceci dit ça marche toujours pas, donc je suppose que j'ai oublié quelque chose dans la classe MyWidget, mais je trouve pas quoi, est-ce que vous voyez ce que c'est ? Je vais peut être abandonner parce que si je trouve pas c'est qu'il y a un truc que j'ai pas du lire ou comprendre dans le cours.
a b L Programmation
14 Juin 2008 18:47:38

Dans la déclaration de la classe, il te faut ajouter les 2 paramètres au constructeur, pour coller au constructeur QLCDNumber (http://doc.trolltech.com/3.2/qlcdnumber.html#QLCDNumber-2)
  1. public:
  2. MyWidget(uint numDigits, QWidget * parent);


et dans l'implémentation du constructeur:
  1. MyWidget::MyWidget(uint numDigits, QWidget * parent)
  2. : QLCDNumber( numDigits, parent ) //appel du constructeur de QLCDNumber
  3. {
  4. }


et enlève le MyWidget *m_lcd; de MyWidget ! :) 
Je vois que tu ne sais pas programmer en orienté objet. Les classe sont comme si tu définissais un type. Tu définis le type MyWidget qui hérite de QLCDNumber, c'est-à-dire que le type MyWidget est le type QLCDNumber personnalisé.
à partir de la classe MyWidget, tu peux créer plein d'objets de type MyWidget (la classe n'est pas un objet, mais juste la description type des objets).
Dans ta classe MaFenetre, tu indiques que tous les objets de type MaFenetre possèderont des sous objets (c'est ce que tu déclares dans la classe). Donc, tous les objets de type MaFenetre possèderont chacun un objet de type MyWidget.
Dans le main(), tu crées un seul objet: fenetre de type MaFenetre.
Donc, au final, tu crées un objet fenetre de type MaFenetre (personnalisation d'un QWidget) qui continent, entre autres, un autre objet de type MyWidget (personnalisation d'un QLCDNumber).

Ps: la déclaration de MyWidget:
  1. class MyWidget : public QLCDNumber
  2. {
  3. Q_OBJECT
  4.  
  5. public :
  6. MyWidget(uint numDigits, QWidget * parent);
  7.  
  8. public slots :
  9. void buttonClicked ();
  10. };
14 Juin 2008 21:36:34

Vous avez raison, je ne sais pas programmer en orienté objet, ou peu, j'ai fait beaucoup de C mais très peu de C++, et en plus j'ai zappé une partie de cours sur les classes sans m'en rendre compte (je me suis arrêté en plein milieu et quand j'ai repris c'était pas le bon endroit) donc je crois qu'il faut que je reprenne tout ça, ceci dit maintenant j'ai compris pourquoi ça ne marchait pas. Merci beaucoup de m'avoir aidé (et d'avoir été patient jusqu'au bout ^^').
Merci encore, bonne soirée !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS