Problème Qt
Dernière réponse : dans Programmation
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
MaFenetre.h :
MaFenetre.cpp :
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 !
Main.cpp
#include <QApplication>
#include "MaFenetre.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MaFenetre fenetre;
fenetre.show();
return app.exec();
}
MaFenetre.h :
#ifndef DEF_MAFENETRE
#define DEF_MAFENETRE
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLCDNumber>
#include <QSlider>
#include <QProgressBar>
class MyWidget : public QLCDNumber
{
Q_OBJECT
public :
MyWidget();
public slots :
void buttonClicked (); //ceci
private :
QLCDNumber *m_lcd;
};
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
public slots :
void changerLargeur (int largeur);
void changerHauteur (int hauteur);
private:
QSlider *m_slider;
QSlider *m_sliderv;
QLCDNumber *m_lcd;
QProgressBar *m_barre;
QPushButton *m_bouton;
};
#endif
MaFenetre.cpp :
#include "MaFenetre.h"
void MaFenetre::changerHauteur (int hauteur)
{
setFixedSize(width(), hauteur);
}
void MaFenetre::changerLargeur (int largeur)
{
setFixedSize(largeur, height());
}
void MyWidget::buttonClicked () //ceci
{
m_lcd -> display (48);
}
MaFenetre::MaFenetre() : QWidget()
{
setFixedSize(400, 400);
m_slider = new QSlider (Qt::Horizontal, this);
m_slider -> setRange (200, 1000);
m_slider -> setGeometry (10, 60, 150, 20);
m_sliderv = new QSlider (Qt::Vertical, this);
m_sliderv -> setRange (200, 1000);
m_sliderv -> setGeometry (160, 10, 20, 150);
m_lcd = new QLCDNumber (1, this);
m_lcd -> setSegmentStyle (QLCDNumber::Filled);
m_lcd -> setGeometry (0, 0, 80, 40);
m_lcd -> (12);
m_bouton = new QPushButton ("1", this);
m_bouton -> setGeometry (250, 250, 20, 20);
QObject::connect (m_slider, SIGNAL (valueChanged(int)), this, SLOT (changerLargeur(int)));
QObject::connect (m_sliderv, SIGNAL (valueChanged(int)), this, SLOT (changerHauteur(int)));
QObject::connect (m_bouton, SIGNAL (clicked()), m_lcd, SLOT (buttonClicked())); //cette ligne
}
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
Lassé par la pub ? Créez un compte
void MyWidget::buttonClicked () //ceci
{
m_lcd -> display (48);
}
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 )
Ah ok, c'est surment juste un problème de rafraichissement de l'affichage, essaie d'appeler un update:
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,
void MyWidget::buttonClicked () //ceci
{
m_lcd -> display (48);
m_lcd->update();
update();
}
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,
c'est quoi ça ?
m_lcd -> (12);
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
...
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...
...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...
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.
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.
Tu as fait un héritage.
class MyWidget : public QLCDNumber
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.
Voilà ce que j'ai changé dans MaFenetre.h
La seule chose que j'aie changée dans MaFenetre.cpp c'est ça :
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.
class MyWidget : public QLCDNumber
{
//ce qu'il y a après ça
Q_OBJECT
public :
MyWidget::MyWidget();
public slots :
void buttonClicked ();
private :
MyWidget *m_lcd;
};
class MaFenetre : public QWidget
{
Q_OBJECT
public:
MaFenetre();
public slots :
void changerLargeur (int largeur);
void changerHauteur (int hauteur);
private:
QSlider *m_slider;
QSlider *m_sliderv;
MyWidget *m_lcd; // et ça
QProgressBar *m_barre;
QPushButton *m_bouton;
};
La seule chose que j'aie changée dans MaFenetre.cpp c'est ça :
je n'ai rien fait d'autre.
m_lcd = new MyWidget (1, this);
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.
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)
et dans l'implémentation du constructeur:
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:
public:
MyWidget(uint numDigits, QWidget * parent);
et dans l'implémentation du constructeur:
MyWidget::MyWidget(uint numDigits, QWidget * parent)
: QLCDNumber( numDigits, parent ) //appel du constructeur de QLCDNumber
{
}
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:
class MyWidget : public QLCDNumber
{
Q_OBJECT
public :
MyWidget(uint numDigits, QWidget * parent);
public slots :
void buttonClicked ();
};
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 !
Merci encore, bonne soirée !
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumProbleme image lcd samsung
- ForumSamsung tv lcd led
- ForumProblème écran plat philips
- ForumQuelle différence entre écran plasma et lcd
- ForumLcd lg pas image son ok
- ForumPixels morts sur l' écran pc samsung
- ForumProgramme en c résolu
- articlesTéléviseur lcd sony ou philips
- ForumIndicateur batterie samsung sgh j700
- ForumEcran pc samsung syncmaster lcd display 2343n
- Voir plus