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 :

QProgressDialog simple usage


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut QProgressDialog simple usage
    Salut,
    J'expérimente avec QProgressDialog:
    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
     
    #include <QtGui>
    #include <QProgressDialog>
     
     
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    	QProgressDialog progressDialog("Dumping", "Abort", 0, 3, 0);
    	progressDialog.setMinimumDuration(0);
    	progressDialog.setVisible(true);
    	progressDialog.setLabelText("init...");
    	progressDialog.setValue(0);
    	progressDialog.setLabelText("0...");
    	sleep(5);
    	progressDialog.setValue(1);
    	progressDialog.setLabelText("1...");
    	sleep(5);
    	progressDialog.setValue(2);
    	progressDialog.setLabelText("2...");
    	sleep(5);
    	progressDialog.setValue(3);
    	progressDialog.setLabelText("3...");
    	sleep(5);
    	return app.exec();
    }
    Le texte "init..." n'est pas écrit instamment (on attend quelques secondes), puis "0..." est écrit après quelques secondes, et enfin "2..." est écrit et l'application se termine à la fois.
    Je ne comprends pas pourquoi les textes "1..." et "3..." ne sont pas écrits pas du tout? J'ai lit les documents de QProgressDialog et de setMinimumDuration(), mais pas de conclusion.
    Merci et pardon de mon mauvais français.

  2. #2
    Membre expérimenté Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Par défaut
    Salut,
    je te dirais que faire des sleeps n'est pas la meilleure façon de tester, j'aurais plutôt fait un QTimer, relié à un slot qui incrémente une valeur, laquelle tu affiche dans la processDialog. Le QTimer fonctionne comme un QThread

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,
    Citation Envoyé par karastojko Voir le message
    Le texte "init..." n'est pas écrit instamment (on attend quelques secondes), puis "0..." est écrit après quelques secondes, et enfin "2..." est écrit et l'application se termine à la fois.
    Je ne comprends pas pourquoi les textes "1..." et "3..." ne sont pas écrits pas du tout?
    Parce-que l'affichage sur les widgets Qt, ou leurs rafraichissements s'effectuent dans la boucle d'événements Qt qui est ...
    donc à la fin de ton code...

    En gros ce que tu fais signifie que tu demandes à la barre de progression de changer de valeur mais sans qu'elle puisse se redessiner. Et quand le programme arrive enfin à la boucle d'événement, ta barre de progression est déjà rendue à ton étape "3"...

    Ce que dis karastojko est correct... Il faut que tu passes par un QTimer ou un QThread, pour avoir des résultats visuels corrects.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Merci pour la réponse.
    La même chose se passe avec le programme complet, voilà un fragment arraché d'une fonction d'une MainWindow classe:
    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
     
    QProgressDialog progressDialog(this);
    progressDialog.setRange(0, 3);
    progressDialog.setLabelText("Dumping");
     
    DatabaseDumpDialog* dlg = new DatabaseDumpDialog(this);
    short res = dlg->exec();
     
    progressDialog.setVisible(true);
    progressDialog.setValue(0);
     
    if (res == 1)
    {
        // ...
        progressDialog.setValue(1);
        if (dlg->readGzip())
        {
            // ...
            progressDialog.setValue(2);
        }
        if (status != -1 && dlg->readEmail() != "")
        {
            // ...
        }
        progressDialog.setValue(3);
        progressDialog.setVisible(false);
    }
    Le programme utilise QApplication, QMainWindow et les autres Qt widgets, mais le progress dialog se redessine pas comme je desirerais. Donc, est-ce que le progress dialog est à la boucle d'événement? Est-ce qu'il est placé dans un autre thread?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    IL y as deux façon d'utiliser QProgressDialog.
    http://qt.developpez.com/doc/4.6-sna...ialog/#details
    http://qt.developpez.com/doc/4.6-sna...og/#value-prop

    tois cela devrais correspondre à une QProgressDialog qui va appeler l'evntloop à chaque setValue.
    Sinon, regarde
    http://qt.developpez.com/faq/?page=qt4Gui#de-geler-ihm

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Serbie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Par défaut
    Merci pour cet example, il marche comme supposé, mais ceci de moi ne marche pas, même avec QCoreApplication::processEvents(). Evidemment elle se redessine pas, mais j'en vois aucune façon de la forcer de se redessiner.

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Voilà un petit exemple très simple d'utilisation d'une QProgressBar qui pourra t'aider... Inspire toi de cet exemple et n'hésite pas à poser des questions.

    Tout d'abord, un petit thread qui va simuler un traitement...
    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
    // "Fichier Process.h
    #include <QProgressDialog>
    #include <QThread>
    class Process : public QThread {
    	Q_OBJECT
    private:
    	bool m_stop;
    public:
    	Process () {};
    	~Process () {};
    	// Méthode du processus...
    	void run () {
    		m_stop = false;
    		for (int i=0; !m_stop && i<=10; i++) {
    			// Emission des signaux pour la progress bar 
    			emit progressValue (i*10);
    			emit newText ("Etape " + QString::number (i));
    			sleep (1);
    		}
    	};
    signals:
    	void progressValue (const int);
    	void newText(const QString&);
    public slots:
    	void cancel () {
    		m_stop = true;
    	};
    };
    Et ici le main qui initialise tout le monde...
    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
    29
    30
    // Fichier main.cpp
    #include <QtGui/QApplication>
    #include "Process.h"
     
    int main (int argc, char *argv[]) {
    	QApplication a (argc, argv);	
    	Process process;
     
    	// Initialisation de la progress bar
    	QProgressDialog dlg;
    	dlg.setWindowTitle ("Test du QProgressDialog");
    	dlg.setRange (0, 100);
     
    	// Connexion entre la progress bar et le thread
    	QObject::connect (&process, 
    		SIGNAL(progressValue(int)), &dlg, SLOT(setValue(int)));
    	QObject::connect (&process, 
    		SIGNAL(newText(QString)), &dlg, SLOT(setLabelText(QString)));
    	QObject::connect (&dlg, 
    		SIGNAL(canceled()), &process, SLOT(cancel())) ;
     
    	// On affiche la progress bar
    	dlg.show ();
    	// On lance le thread
    	process.start ();
     
    	// On lance la boucle d'événements de l'application qui va transmettre
    	// les signaux entre la progress bar et le thread
    	return a.exec ();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bon je vais essayer d'être simple :
    Par fpouget dans le forum Langage SQL
    Réponses: 8
    Dernier message: 09/04/2003, 17h46
  2. Edition d'un simple fichier java
    Par mcrepin dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 21/03/2003, 14h28
  3. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

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