Comme dans le titre, je suis en plein dans les signaux et slot.
Comme suggéré en exercice j'essaie de connecter un bouton pour remettre a 0 QProgressBar : J'y suis arrivé. La barre de progression revient a 0. Mais QSlider non.
-Est-til possible de réinitialiser QSlider?
-Si oui dans quelle classe je peut trouver le slot pour réinitialiser QSlider (si c'est bien par un slot que l'on vas le réinitialiser)?
-Sinon quelle méthode pour une telle prouesse!!
J'ai déjà essayé ça.
J'ai tenté d'écumer la doc un peu avant de poster et j'ai essayé d'autre slot qui me semblait possible, mais je me souvient plus trop de leurs nom...
Sinon le code de MaFenetre.cpp :
#include "Mafentre.h"
MaFenetre::MaFenetre() : QWidget()
{
setFixedSize(300, 100);
m_ProgressBar = new QProgressBar(this);
m_ProgressBar->setGeometry(10, 20, 150, 20);
m_slider = new QSlider(Qt::Horizontal, this);
m_slider->setRange(0, 100);
m_slider->setGeometry(10, 60, 150, 20);
m_quitter = new QPushButton("Quitter",this);
m_quitter->move(200, 20);
m_reset = new QPushButton("RAZ !!", this);
m_reset->move(200, 60);
QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_ProgressBar, SLOT(setValue(int))); //==> connection entre le slider et QProgressBar ==> fonctionne.
QObject::connect(m_reset, SIGNAL(clicked()), m_ProgressBar, SLOT(reset())); //Remise à 0 de QProgressBar après l'apuis du bouton "RAZ !!" (m_reset) ==> fonctionne.
QObject::connect(m_reset, SIGNAL(cliked()), m_slider, SLOT( setValue(int))); //C'est lui qui fait de la résistance!
QObject::connect(m_quitter, SIGNAL(clicked()),qApp ,SLOT(quit())); //Quand on clique sur quitter et bien heu... on quitte ==> Et fonctuionne.
}
A noté une faute de frappe dans le nom du .h (Mafentre.h) mais bien prise en compte dans le nom des fichiers etc... Mon programme compile et ce lance.
Attention les paramètres des slots doivent correspondrent. Tu peux te faire un slot personnalisé (genre reset() ), que tu appelle au signal clicked() et qui remet ton slider à zero (et par la même occasion ta progress bar, comme ça tu peux supprimer une connexion).
[...] error: `setTickPosition' was not declared in this scope.
Je ne suis pas sur que la méthode employer est bien celle que j'ai mis, mais comme le compilo me dit qu'il ne connait pas cette méthode j'aimerai d'abord régler ce problème.
setMinimum et setValue sont des méthodes du QSlider ou de la QProgressBar. Or là vu comment tu les appelles, c'est les méthodes de ta fenêtre (qui hérite de QWidget) que tu appelles ! Or QWidget n'a pas de méthode setMinimum... donc ça plante.
Il faut faire :
m_slider->setValue(0);
Et voilà
Ca appellera la méthode setValue du slider, au lieu d'appeler celle de la fenêtre.
Re j'ai un peu tardé a répondre car le problème de départ n'est pas résolut.
Suite à ta correction, ça compile, mais ça n'a aucun effet quand je clique sur "RAZ !!".
Je pense que je n'emploie pas les bonnes méthode (car c'est bien des méthode qu'il faut utiliser et non les slots?), et bon bas il parait qu'elle est bien faite ? il n'en reste pas moins qu'elle est énorme et je m'y perd un peu beaucoup...
Merci pour ton aide.
EDIT: I am a pure Boulet!!
J'avait oublié de décommenter Q_OBJECT, alors forcement... Je le ferai plus c'est promis
J'ai changé aussi les méthodes : j'en ai trouver une qui marche pour le QSlider (il s'agit de setSliderPosition(0)) et setValue(in) pour QProgressBar.
Bref sa compile et sa marche comme je veux...
Mais bas oui mais... Je suis parvenu à configurer Code::Bocks pour compiler avec Qt et sa marchais, jusqu'as se que j'ai eu a compiler avec Q_OBJECT ou j'ai droit à :
Citation : Compilateur Code::Blocks
undefined reference to `vtable for MaFenetre'
Donc avec qmake -project puis qmake et make je peux compiler et lancer le programme. ma question:
Est-il possible de configurer Code::Blocks ou pas pour régler se problème?
En tout cas problème n° 1 résolut et merci au SDZ!!
Franchement, dans l'absolu c'est peut-être possible mais c'est trop compliqué. J'ai essayé en vain jusqu'ici. Je te recommande de compiler avec la console dès que tu utilises la macro Q_OBJECT car il est obligatoire d'appeler qmake avant.
Désolé de revenir si tard sur le sujet mais en cherchant à comprendre la même erreur, je suis arrivé rapidement sur ce post. J'imagine que ça pourra donc servir à quelqu'un d'autre.
Dans le cas où on utilise des slots personnalisés et donc la macro Q_OBJECT, il faut en effet passer par le moc (comme c'est si bien expliqué dans le tuto de c++). Si, à travers un terminal, cela ne pose pas de problème, Code::Bocks renvoie une erreur "undefined reference to `vtable for (nomdufichier)'".
pour résoudre ce problème, il suffit d'ajouter dans le projet (an faisant un Add Files) le fichier moc_(nomdufichier).cpp qui se trouve dans le même répertoire que le header et son implémentation.
Voila. En espérant que ca serve à quelqu'un
Bonne journée
Entre les slots etles signaux je me perd un peu
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
If you'd like to join us, read "How do we work at OpenClassrooms"! :)
If you'd like to join us, read "How do we work at OpenClassrooms"! :)
If you'd like to join us, read "How do we work at OpenClassrooms"! :)