Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt - débutant] Remettre le slider à zéro

Quelques essais mais rien ne se passe...

Sujet résolu
5 mars 2010 à 15:05:14

Bonjour,

J'ai commencé à utiliser Qt hier, et je m'entraîne aujourd'hui à faire un slider & une barre de progression ;) :


Image utilisateur


Après avoir rapidement réussi à faire la fenêtre, j'ai voulu mettre au point un bouton "Reset", réinitialisant la barre de progression à 0.
Mais le problème est que le slider, lui, ne revenait pas à sa position initiale. J'ai donc cablé (quelle belle métaphore :p ) la barre au slider.

QObject::connect(m_bar, SIGNAL(valueChanged(int)), m_slider, SLOT(setValue(int)));


Mais ça ne fonctionne toujours pas. :'(

Voici le code du constructeur :

Fenetre::Fenetre(int longueur_fenetre, int hauteur_fenetre) : QWidget()
{
    setFixedSize(longueur_fenetre, hauteur_fenetre);

    /* Création de la barre de progression */
    m_bar = new QProgressBar(this);
    m_bar->setGeometry(10, 20, 150, 20);

    /* Création du slider */
    m_slider = new QSlider(Qt::Horizontal, this);
    m_slider->setGeometry(10, 60, 150, 20);

    /* Création du bouton reset */
    m_reset = new QPushButton("Reset", this);
    m_reset->setGeometry(10, 100, 100, 40);
    m_reset->setFont(QFont("Arial Black", 15, 50, true));
    m_reset->setCursor(Qt::PointingHandCursor);
    m_reset->setToolTip("Remet à zéro la barre de progression");

    /* Connexions */
    QObject::connect(m_slider, SIGNAL(valueChanged(int)), m_bar, SLOT(setValue(int)));
    QObject::connect(m_bar, SIGNAL(valueChanged(int)), m_slider, SLOT(setValue(int)));
    QObject::connect(m_reset, SIGNAL(clicked()), m_bar, SLOT(reset()));
}


Pourriez-vous m'aider à trouver le problème, surtout que commençant avec Qt...

Merci d'avance :)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 mars 2010 à 15:10:35

Salut, tu créer un bouton (QPushButton), que tu affiches (widget parent + layout). Ensuite tu récupere le signal cliked() par exemple que tu connectes à un ton slot personnalisé, qui remettra le slider et la barre de progression à 0. Regarde setValue() de QProgressBar et setValue de QAbstractSlider, classe parente de QSlider ;)
  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2010 à 15:20:24

Merci pour ta réponse.

Même si je ne connais pas les slots personnalisés, c'est juste mon prochain passage à lire, ça ne doit pas être si difficile que ça. ;)

Mais je viens tout juste d'essayer de connecter le bouton m_reset aux slots setValue de la barre et setValue du slider, mais ça ne marche pas... Je suis forcé de créer un slot personnalisé ? :o
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 mars 2010 à 15:26:55

La fonction setValue(), prend une paramètre de type int. Si tu envoie la valeur 4 à cette méthode de QProgressBar, alors ta barre de progression vaudra 4%. C'est pas sorcier ;)

Mais là, en effet tu seras contraint à créer un slot personnalisé, tu verras ce n'est pas bien compliqué ;)
  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2010 à 16:02:18

Après quelques essais infructueux, j'ai compris comment ça marchait (en gros, hein :p ) mais.. ça marche pas :lol:

Voici le code:

void Fenetre::reinitialiser(QProgressBar *barre, QSlider *slider)
{
    barre->reset();
    slider->setValue(0);
}


Et la connexion:

QObject::connect(m_reset, SIGNAL(clicked()), this, SLOT(reinitialiser(m_bar, m_slider)));


J'aimerai bien avoir plus d'infos, parce que là, je pédale dans la semoule. ^^
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
5 mars 2010 à 16:46:01

Dans ta définition de classe, tu as bien le prototype suivant :

public slot:
void reinitialiser(QProgressBar *barre, QSlider *slider)


Ensuite, sache que lors d'une connexion signal/slot, on ne peut transmettre que des paramètres en indiquant les types (int, double, char...). donc pas de nom, et surtout pas de valeur.

Essaye les codes suivants, et fait de ton mieux pour les comprendre ;)

#ifndef FILE__MaClasse
#define FILE__MaClasse

#include <QtGui>

class MaClasse : public QWidget
{
	Q_OBJECT
	
	public:
		MaClasse(QWidget* widgetParent = 0);

        public slots:
		void reinitialiserTout();

	protected:
	       QProgressBar* _barre;
               QSlider* _slider;
               QPushButton* _bouton;
};

#endif


#include "MaClasse.hpp"

MaClasse::MaClasse(QWidget* widgetParent)
{
	this->resize(300, 100);
	this->setWindowTitle("Ma Classe");
	
	_barre = new QProgressBar();
		_barre->setMinimum(0);
		_barre->setMaximum(100);
    _slider = new QSlider(Qt::Horizontal);
		_slider->setMinimum(0);
		_slider->setMaximum(100);
    _bouton = new QPushButton("Reset");
	
	QVBoxLayout* layoutPrincipal = new QVBoxLayout(this);
		layoutPrincipal->addWidget(_barre);
		layoutPrincipal->addWidget(_slider);
		layoutPrincipal->addWidget(_bouton);
	
	QObject::connect(_slider, SIGNAL(valueChanged(int)), _barre, SLOT(setValue(int)));
    QObject::connect(_bouton, SIGNAL(clicked()), this, SLOT(reinitialiserTout()));
	
	this->show();
}

void MaClasse::reinitialiserTout()
{
	_barre->setValue(0);
    _slider->setValue(0);
}

  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2010 à 17:36:19

Alors comme j'ai absolument rien compris à ce que tu m'as écrit en mode Qt/C++ (ne le prends pas mal, c'est ma faute, hein! :p ), j'ai juste lu le français (c'est mieux :lol: ):

Citation : Abdelite

Ensuite, sache que lors d'une connexion signal/slot, on ne peut transmettre que des paramètres en indiquant les types (int, double, char...). Donc pas de nom, et surtout pas de valeur.



Et comme j'ai entraperçu dans un moment de lucidité que ta fonction réinitialiserTout était void et prenait directement les m_bar et m_slider... Et ben j'ai fait pareil !

void Fenetre::reinitialiser()
{
    m_bar->reset();
    m_slider->setValue(0);
}


Et la connexion :

QObject::connect(m_reset, SIGNAL(clicked()), this, SLOT(reinitialiser()));


Et figure toi que ça marche sans QVBox et tout le tralala, c'est magique ! :magicien:

Merci ;)
  • Partager sur Facebook
  • Partager sur Twitter
1 février 2011 à 17:59:59

Merci pour cette aide ça a résolu une question que je me posais sur un autre topic ;)
  • Partager sur Facebook
  • Partager sur Twitter
20 juin 2013 à 14:48:32

Merci j'ai eu le même souci :) j'ai pu comprendre grâce à vous :)
  • Partager sur Facebook
  • Partager sur Twitter
give to get :)
19 janvier 2021 à 20:43:31

Hey j'était en train de faire exactement la même chose avec le même problème.

En fait je savais pas pour le this de : 

QObject::connect(m_bouton[1],SIGNAL(clicked()),this,SLOT(reset()));  ( oui j'ai fait des vectors de bouton et de slider)
Voici ce que j'avais écrit a la base si jamais quelqu'un a encore la même idée au lieu de lire le cour.
QObject::connect(m_bouton[1],SIGNAL(clicked()),m_slider[1],SLOT(reset())); <--- (pas bon)
mon " bouton[0] et "slider [0]" controle le QLCDNumber.
En tout cas merci pour la solution abdelite.

-
Edité par MichasMoi 19 janvier 2021 à 20:46:01

  • Partager sur Facebook
  • Partager sur Twitter

for ( size_t nbMembre  :  membreForum )   { std::cout << "Bonjour ! \n"; }

20 janvier 2021 à 11:56:07

@MichasMoi Bonjour, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter