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 :

systray animé Qt


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 16
    Points
    16
    Par défaut systray animé Qt
    Bonjour, je veux creer un systray animé avec qt à partir d'une image gif dont je dispose, et qui est animée.
    Le problème c'est que quand je reduis la fenetre ,l'image apparait bien dans la barre des taches, mais sans l'animation.Voila le code :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include "window.hpp"
     
    Window::Window() : QWidget()
    {
    	createActions(); // création de restaure et quite
     
    	text = new QLabel("Texte 0", this);
    	resize(300,100);
     
    	sticon = new QSystemTrayIcon(this); // on construit notre icône de notification
     
    	// Création du menu contextuel de notre icône
    	QMenu* stmenu = new QMenu(this);
     
    	stmenu->addAction(actTexte1);
    	stmenu->addAction(actTexte2);
    	stmenu->addAction(restoreAction);
    	stmenu->addAction(quitAction);
     
    	sticon->setContextMenu(stmenu); // On assigne le menu contextuel à l'icône de notification
     
    	QIcon icon("icon.gif");
     
    	sticon->setIcon(icon); // On assigne une image à notre icône
     
    	sticon->show(); // On affiche l'icône
     
    }
     
     
     void Window::closeEvent(QCloseEvent *event)  // c la la feinte de la surcharge !!!
     {
         if (sticon->isVisible()) {
             QMessageBox::information(this, "Test", "Le prog continu a tourner et on ignore le close xD j'V plenter mon systeme moi");
             hide();
             event->ignore();
         }
    	sticon->showMessage("yop","Je suis la"); // On affiche une infobulle
     
     }
     
     
     void Window::createActions()
     {
     
         restoreAction = new QAction("Restaurer", this);
         connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); // le showNormal est bien le slot qu'il nous faut ... en opposition au hide
     
         quitAction = new QAction("Quitter", this);
         connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
     
    	actTexte1 = new QAction("Texte1",this);
    	connect(actTexte1, SIGNAL(triggered()), this, SLOT(changeTexte1()));
     
    	actTexte2 = new QAction("Texte2",this);
    	connect(actTexte2, SIGNAL(triggered()), this, SLOT(changeTexte2()));
     }
     
     
    void Window::changeTexte1()
    {
    	text->setText("Texte 1");
    }
     
    void Window::changeTexte2()
    {
    	text->setText("Texte 2");
    }

  2. #2
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Salut, tu penses que c'est possible pour une icône ? si ça se trouve setIcon() se contente de prendre la première image du gif.

    Pour un label apparement tu peux lire un gif :

    Gif anime dans un label

    Si ce n'est pas possible, tu vas ptêtre devoir envisager l'utilisation d'un timer qui changerait de temps en temps l'icône.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Kestufou Voir le message
    Salut, tu penses que c'est possible pour une icône ? si ça se trouve setIcon() se contente de prendre la première image du gif.
    Normalement oui

    Si ce n'est pas possible, tu vas ptêtre devoir envisager l'utilisation d'un timer qui changerait de temps en temps l'icône.
    A mon avis, en utilisant QMovie il devrais suffir.
    Suffit de modifier l'icone à chaque signal updated ou frameChanged
    http://qt.developpez.com/doc/latest/qmovie.html#updated
    http://qt.developpez.com/doc/latest/...l#frameChanged

    en récupérant la QImage ou QPixmap courante
    http://qt.developpez.com/doc/latest/...l#currentImage
    http://qt.developpez.com/doc/latest/...#currentPixmap

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses.

    Pour le QMovie j'avais regardé mais le constructeur de QIcon ne prenait pas de QMovie, même avec quelques artifice et passsages par des autres classes.

    J'ai donc utilisé un QTimer pour changer l'icone régulièrement, le code (du changement d'icone) est encore un peu fait à l'arrache, j'optimiserai ça enattendant je montre quand même comment je fais si celà peut interesser quelqu'un.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
     
    #include "window.hpp"
     
    Window::Window() : QWidget()
    {
     
    	liste_icone << "anim/n0.png" << "anim/n1.png" << "anim/n2.png" << "anim/n3.png" << "anim/n4.png" << "anim/n5.png" << "anim/n6.png" << "anim/n7.png" << "anim/n8.png";
     
    	icone_en_cours = 0;
     
    	createActions(); // création de restaure et quite
     
    	text = new QLabel("Texte 0", this);
    	resize(300,100);
     
    	sticon = new QSystemTrayIcon(this); // on construit notre icône de notification
     
    	// Création du menu contextuel de notre icône
    	QMenu* stmenu = new QMenu(this);
     
    	stmenu->addAction(actTexte1);
    	stmenu->addAction(actTexte2);
    	stmenu->addAction(restoreAction);
    	stmenu->addAction(quitAction);
     
    	sticon->setContextMenu(stmenu); // On assigne le menu contextuel à l'icône de notification
     
    	QIcon icon("icon.gif");
     
    	sticon->setIcon(icon); // On assigne une image à notre icône
     
    	sticon->show(); // On affiche l'icône
     
    	// tentative d'animation de l'icone
    	poller = new QTimer(this);
    	poller->start(100); // changement toutes les secondes
    	connect(poller, SIGNAL(timeout()), this, SLOT(changer_icone()));
    }
     
     
     void Window::closeEvent(QCloseEvent *event)  // c la la feinte de la surcharge !!!
     {
         if (sticon->isVisible()) {
             QMessageBox::information(this, "Test", "Le prog continu a tourner et on ignore le close xD j'V plenter mon systeme moi");
             hide();
             event->ignore();
         }
    	sticon->showMessage("yop","Je suis la"); // On affiche une infobulle
     
     }
     
     
     void Window::createActions()
     {
     
         restoreAction = new QAction("Restaurer", this);
         connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); // le showNormal est bien le slot qu'il nous faut ... en opposition au hide
     
         quitAction = new QAction("Quitter", this);
         connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
     
    	actTexte1 = new QAction("Texte1",this);
    	connect(actTexte1, SIGNAL(triggered()), this, SLOT(changeTexte1()));
     
    	actTexte2 = new QAction("Texte2",this);
    	connect(actTexte2, SIGNAL(triggered()), this, SLOT(changeTexte2()));
     }
     
     
    void Window::changeTexte1()
    {
    	text->setText("Texte 1");
    }
     
    void Window::changeTexte2()
    {
    	text->setText("Texte 2");
    }
     
     
    void Window::changer_icone()
    {
    	//std::cout << icone_en_cours << std::endl;
    	icone_en_cours++;
    	if ( icone_en_cours == liste_icone.size() )
    	{
    		icone_en_cours = 0;
    	}
    	// version non optimisée
    	QIcon icon( liste_icone[icone_en_cours] );
    	sticon->setIcon(icon); // On assigne une image à notre icône
    }

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par saffir Voir le message
    Merci pour vos réponses.

    Pour le QMovie j'avais regardé mais le constructeur de QIcon ne prenait pas de QMovie, même avec quelques artifice et passsages par des autres classes.
    QMovie donne une QPixmap qui peut être converti en QIcon et donne un signal lors d'un changement d'image. Pour utiliser un gif animé, je pense que QMovie est adapté.

    Citation Envoyé par saffir Voir le message
    J'ai donc utilisé un QTimer pour changer l'icone régulièrement, le code (du changement d'icone) est encore un peu fait à l'arrache, j'optimiserai ça enattendant je montre quand même comment je fais si celà peut interesser quelqu'un.
    Si tu utilise plusieurs image séparé, ta méthode est bonne
    Peut être en utiliser un iterator au lieu d'un index.. Mais ca reviens au même.

    PS : je mettrais bien ceci dans la FAQ. Ça t'intéresserai de l'écrire? Je rajouterai une version avec QMovie après l'avoir testé.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    voici un exemple avec QMovie

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <QtGui>
     
    class MyWindow : public QWidget
    {
        Q_OBJECT
        //lecteur d'image animee
        QMovie      m_movie;
        //objets qui utilise une icone
        QPushButton *m_but;
        QSystemTrayIcon m_sysTray;
    public :
        MyWindow( )
        {
            //layout et le boutton seront re-parente 
            //par le setLayout
            QLayout * l = new QVBoxLayout;
            {
                m_but = new QPushButton;
                l->addWidget(m_but);
            }
            setLayout(l);
            //connect l'evenement updated pour changer d'image dans les icones
            connect(&m_movie, SIGNAL(updated ( const QRect & )),this,SLOT(MAJ()));
            //boutton : permet de prendre une autre images animee
            connect(m_but, SIGNAL(clicked( )),this,SLOT(nouvelleImageAnimee()));
     
            //ajout dans l'event loop 
            QTimer::singleShot(0,this,SLOT(nouvelleImageAnimee()));
        }
    private slots:
        //selection d'une image animee et lecture par le QMovie
        void nouvelleImageAnimee()
        {
            QString s =QFileDialog::getOpenFileName(this,"choisir video d'image",QString(),"*.gif *.mng");
            if (!s.isEmpty())
            {
               m_movie.stop();
               m_movie.setFileName(s);
               m_movie.start();
            }
     
        }
     
        //modifie l'icone pour le boutton, le systray et le titre de la fenetre
        void MAJ()
        {
            QIcon icon(m_movie.currentPixmap());
            //modifie l'icone du boutton
            m_but->setIcon(icon);
            //modifie l'icone du systray
            m_sysTray.setIcon(icon);
            m_sysTray.show();
            //modifie l'icone de la fenetre
            setWindowIcon(icon);
        }
     
    };
    //astuce pour ne pas avoir plusieur fichier
    #include "main.moc"
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        MyWindow w;
        w.show();
        return app.exec();
    }
    pour compiler :
    1- copier le code dans un fichier nommé main.cpp
    2- qmake -project
    3- qmake
    4- make

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Merci MonGaulois, en suivant tes conseils j'ai réussi à faire un code qui me semble à peu pres correct :


    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <QApplication>
     
    #include "window.h"
     
    int main(int argc, char **argv)
    {
        QApplication app(argc, argv);
        Window w;
        w.show();
        return app.exec();
    }

    window.h
    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
    31
    32
     
    #ifndef H_WINDOW
    #define H_WINDOW 
     
    #include <QSystemTrayIcon>
    #include <QtGui>
     
    class QSystemTrayIcon;
    class QLabel;
     
    class Window : public QWidget
    {
    	Q_OBJECT
     
    	public:
    		Window();
     		void closeEvent(QCloseEvent *event);
     
    	public slots:
    		void updateIcon();
     
    	private:
    		QSystemTrayIcon* sticon;
     
    		QAction *restoreAction;
    		QAction *quitAction;
     
    		QMovie *movieIcon; // pour avoir une icone en mouvement a partir d'un gif
     
    };
     
    #endif


    window.cpp
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include "window.h"
     
    Window::Window() : QWidget()
    {
     
    	resize(300,100);
    	sticon = new QSystemTrayIcon(this); // on construit notre icône de notification
     
     
    	// Création des actions et du menu contextuel de notre icône
     
        restoreAction = new QAction("Restaurer", this);
        connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
        quitAction = new QAction("Quitter", this);
        connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
     
    	QMenu* stmenu = new QMenu(this);
    	stmenu->addAction(restoreAction);
    	stmenu->addAction(quitAction);
    	sticon->setContextMenu(stmenu); // On assigne le menu contextuel à l'icône de notification
     
     
    	// l'icone
    	movieIcon = new QMovie("icon.gif");
    	movieIcon->start();
    	connect(movieIcon, SIGNAL(frameChanged(int)), this, SLOT(updateIcon())); 
     
    	// on affiche tout de même l'icone statique une premiere fois
    	sticon->setIcon(QIcon("icon.gif"));  	// On assigne une image à notre icône
    	sticon->show(); 						// On affiche l'icône
    }
     
     
     
     
    /*
    on surcharge closeEvent, ce qui nous permet de seulement réduire
    et non de le fermer, ceci seulement si celui-ci est visible
    */ 
    void Window::closeEvent(QCloseEvent *event)
    {
        if (sticon->isVisible()) {
             QMessageBox::information(this, "Test", "Le programme continue à tourner");
             hide();
             event->ignore();
         }
    	sticon->showMessage("yop","Je suis la"); // On affiche une infobulle
    }
     
     
     
     
     
    void Window::updateIcon()
    {
    	QIcon icon(movieIcon->currentPixmap());
    	sticon->setIcon(icon); // On assigne une image à notre icône
    }
    Voilà et pour la FAC tu fais comme tu veux si tu veux que j'écrive, j'écrirai sinon je te laisse faire
    Encore merci

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

Discussions similaires

  1. icone animée dans le systray avec gtk+
    Par jamfr73 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 13/02/2007, 18h31
  2. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11
  3. [Composants][Animation] Lire une vidéo compressée
    Par femtosa dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2002, 08h03
  4. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09
  5. Passage de parametre a une anim Flash 5
    Par debug dans le forum Intégration
    Réponses: 4
    Dernier message: 03/06/2002, 17h59

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