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 :

Afficher un QAction dans un trayIconMenu selon un bool.


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut Afficher un QAction dans un trayIconMenu selon un bool.
    Bonjour,

    je suis entrain de voir pour faire une amélioration qui me permet d'afficher un lien dans mon que si connexion_site = true. Qui lui est un bool.

    Donc si l'utilisateur est connecté au site alors je mets connexion_site = true.

    Donc ce qui me donne :

    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
     
    Tool::Tool()
    {
    	// Creation du menu icone
    	trayIconMenu = new QMenu;
     
    	// Creation de la liste
    	createTrayIcon();
     
            // Connexion au site
            connexion_site = false;
    }
     
    ...
     
    if(e.tagName() == "connecte")
            {
                connexion_site = true;
            }
    ...
     
     
    void Tool::createTrayIcon()
    {
        // ajout dans le menu si connexion_site = true
        QAction *verif_httpAction = new QAction(tr("Vérifier les alertes"), this);
        connect(verif_httpAction, SIGNAL(triggered()), this, SLOT(requete_http()));
     
        if(connexion_site == true)
        {
            trayIconMenu->addAction(verif_httpAction);
        }
     
    	setContextMenu(trayIconMenu);
    	connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
     
        show();
    }
    Le problème c'est qu'il me fait rien j'ai jamais de QAction dans mon menu même si je suis connecté ou si je ne le suis pas...

    Merci !

  2. #2
    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
    ou fait tu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(e.tagName() == "connecte")
            {
                connexion_site = true;
            }
    est tu sur que tu le fait avant ta fonction Tool::createTrayIcon()

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Oui c'est bien dans le même ordre que j'ai mis dans des slots différent.

    Enfaite si je mets :
    connexion_site = true; dans void Tool::createTrayIcon().

    Il m'affiche le lien et si je mets false il me le cache bien donc le système fonctionne très bien en lui même mais c'est juste qu'il ne reçoit pas le bool lors de la création du menu enfaite en y réfléchissant c'est assez logique...

    Le menu se créer et seulement après on peux exécuter les Requêtes etc...

    Donc je sais pas comment je peux faire... Une idée ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut A
    Tu peux déclarer ton action dans le header (pour l'avoir accessible dans toutes les méthodes de ta classe) et l'ajouter sans faire le test de ton booleen dans createTrayIcon, puis tu la cache avec setVisible(false) ou la grise avec setEnabled(false), et lorsque tu es connecté tu la rend visible (ou active):
    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
     
    Tool::Tool()
    {
    	// Creation du menu icone
    	trayIconMenu = new QMenu;
     
    	// Creation de la liste
    	createTrayIcon();
     
            // Connexion au site
            connexion_site = false;
    }
     
    ...
     
    if(e.tagName() == "connecte")
            {
                connexion_site = true;
                verif_httpAction->setVisible(true); // ou bien
    //          verif_httpAction->setEnabled(true); 
     
            }
    ...
     
     
    void Tool::createTrayIcon()
    {
     
        verif_httpAction = new QAction(tr("Vérifier les alertes"), this);
        verif_httpAction->setVisible(false); // ou bien
    //  verif_httpAction->setEnabled(false); 
     
     
        connect(verif_httpAction, SIGNAL(triggered()), this,SLOT(requete_http()));
     
           trayIconMenu->addAction(verif_httpAction);
     
     
    	setContextMenu(trayIconMenu);
    	connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
     
        show();
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Je teste ça demain soir et je te dis si ça fonctionne en tout cas merci beaucoup !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Ca ne fonctionne pas...

    Il n'y a jamais le lien "Vérifier les alertes" !

    Je penche à un souci niveau de déclaration dans "if(e.tagName() == "connecte")
    ".

    Je sais pas si je l'ai bien déclaré... "verif_httpAction->setVisible(true);"
    Si je mets que ça il ne compile pas.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    Chez moi ça fonctionne bien, enfin si j'ai bien compris ce que tu voulais.

    Voila un exemple :

    Le .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
     
    #ifndef WIDGET_H
    #define WIDGET_H
     
    #include <QtGui>
     
    class Widget : public QPushButton
    {
        Q_OBJECT
     
    public:
        Widget(QWidget *parent = 0);
     
    public slots:
        void action_active();
     
    private:
        QAction *action;
    };
     
    #endif // WIDGET_H

    Le .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
     
    #include "widget.h"
     
    Widget::Widget(QWidget *parent) : QPushButton(parent)
    {
     
         action = new QAction("Toto", this);
         action->setEnabled(false);
     
         QMenu *menu = new QMenu(this);
         menu->addAction(action);
     
         QSystemTrayIcon * system_tray_icon = new QSystemTrayIcon(QIcon("C:/Users/Julien/Documents/Programmes/toto/qtdemo.ico"), this);
         system_tray_icon->setContextMenu(menu);
         system_tray_icon->show();
     
     
          setText("Activer / Desactiver");
          connect(this, SIGNAL(clicked()), this, SLOT(action_active()));
      }
     
     
    void Widget::action_active()
    {
        if (action->isEnabled())
        {
            action->setEnabled(false);
        }
        else
        {
            action->setEnabled(true);
        }
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    je suis obligé de mettre quelque chose avant :
    verif_httpAction->setVisible().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(verif_httpAction->isVisible())
    {
                    verif_httpAction->setVisible(false);
    }
    else
    {
                    verif_httpAction->setVisible(true);
    }
    Vu que je le déclare avant ce qui est logique...

    Donc je ne sais pas quoi mettre j'ai essayé plusieurs chose rien n'a faire ça ne compile jamais...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    ton verif_httpAction est déclaré dans le header et créé dans le constructeur, tu n'as besoin de mettre rien d'autre avant verif_httpAction->setVisible().

    Il y a 2 exemples en attaché,
    Le premier (tray) c'est quasi le même que dans le post précédent (mais tu as tous les fichiers pour le faire marcher, juste besoin de changer le chemin vers l'icone).
    Dans le second (system_tray) , la classe tool dérive que QSystemTrayIcon, comme tu l'a fait.

    Essaye les (surtout le second) et je pense que tu aura ta réponse (j'espère).
    Fichiers attachés Fichiers attachés

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Je le déclare à la fin mon QSystemTrayIcon donc j'ai pas la variable en mémoire du coup...

    Il faut que je teste de mettre :
    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
     
    void Tool::createTrayIcon()
    {
        // ajout dans le menu si connexion_site = true
        QAction *verif_httpAction = new QAction(tr("Vérifier les alertes"), this);
        connect(verif_httpAction, SIGNAL(triggered()), this, SLOT(requete_http()));
     
        if(connexion_site == true)
        {
            trayIconMenu->addAction(verif_httpAction);
        }
     
    	setContextMenu(trayIconMenu);
    	connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
     
        show();
    }
    Juste après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Tool::Tool()
    {
    	// Creation du menu icone
    	trayIconMenu = new QMenu;
     
    	// Creation de la liste
    	createTrayIcon();
     
            // Connexion au site
            connexion_site = false;
    }
    Et mettre le reste du code après... Mais je sais pas si ça va bien marcher... Vu que j'ai commencé comme mon première exemple.

    Tool::Tool()

    Ensuite :
    void de connexion

    Et pour finir :
    void Tool::createTrayIcon()

    Qu'elle est le meilleur ordre pour coder ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Bon enfaite ton code fonctionne parfaitement bien

    Mais impossible de l'intègrer sur mon programme vu que toi tu fait un lien dans le menu qui va afficher l'autre lien or moi je voudrais faire une fonction qui se trouve dans un void qui dit si oui ou non il faut afficher le lien...

    Donc je vois pas comment faire...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    Qu'est ce que tu entend par:
    "faire une fonction qui se trouve dans un void"?
    Si ta fonction est dans ta classe Tool tu as juste à écrire le verif_httpActive->setVisible(true) dans cette fonction, et si tu veut le rendre visible depuis l'extérieur de ta classe tu crée une fonction publique du genre:

    dans le header:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public:
        void afficher_verif_http(bool);

    dans le cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Tool::afficher_verif_http(bool afficher)
    {
        if (afficher)
        {
              verif_httpActive->setVisible(true);
        }
        else
        {
               verif_httpActive->setVisible(true);
         }
     
    }

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Par défaut
    Exemple :

    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
     
    void Tool::createTrayIcon()
    {
    // ajout dans le menu si la balise connecte exisite
        verif_httpAction = new QAction(tr("Vérifier les alertes"), this);
        verif_httpAction->setVisible(false); // ou verif_httpAction->setEnabled(false);
        connect(configAction, SIGNAL(clicked()), this, SLOT(requete_http()));
     
    trayIconMenu->addAction(verif_httpAction);
     
     
    void Tool::affiche(bool)
    {
        QDomDocument infos;
        QString errorStr;
        int errorLine;
        int errorColumn;
        QByteArray content = http->readAll();
        if (!infos.setContent(content, true, &errorStr, &errorLine, &errorColumn))
        {
            qDebug() << "Erreur d'analyse du fichier de session";
            qDebug() << content;  return;
        }
     
        QDomElement element = infos.documentElement();
        for(QDomNode n = element.firstChild();
        !n.isNull();
        n = n.nextSibling())
        {
            QDomElement e = n.toElement();
            qDebug() << e.tagName() << e.text();
     
            if(e.tagName() == "connecte")
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
     
                //verif_httpAction->setVisible(true); // ou bien verif_httpAction->setEnabled(true);
                if(verif_httpAction->isVisible())
                {
                    verif_httpAction->setVisible(false);
                }
                else
                {
                    verif_httpAction->setVisible(true);
                }
            }
        }
    }

    Ce qui devrais faire :

    - Je lance le programme le lien dans le menu n'est pas visible.
    - Je me connecte et si je reçois la balise XML "connecte" alors j'exécute une action dans le programme ET je rends visible le lien dans le menu.
    - Si je ne reçois pas la balise XML "connecte" alors je ne rends pas le lien du menu.

    Mais quand je fais comme ça ça n'a pas l'air de fonctionner...

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    J'ai l'impression que tu mélange un peu tout...
    Je reprend ton 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
     
    void Tool::createTrayIcon()
    {
    // ajout dans le menu si la balise connecte exisite
        verif_httpAction = new QAction(tr("Vérifier les alertes"), this);
        verif_httpAction->setVisible(false); // ou verif_httpAction->setEnabled(false);
        connect(configAction, SIGNAL(clicked()), this, SLOT(requete_http()));
     
    trayIconMenu->addAction(verif_httpAction);
     
     
    void Tool::affiche(bool)  // <- tu ne donne pas de nom à ton bool que tu reçois, tu peut déclarer une fonction comme ça dans la définition de ta classe (le header), mais pas au moment de l'écriture de ta fonction (le cpp)
    {
        QDomDocument infos; // <- tu fais le traitement de ton XML dans une fonction qui est juste censé afficher quelque chose, tu devrais le faire dans une autre classe
        QString errorStr;
        int errorLine;
        int errorColumn;
        QByteArray content = http->readAll();
        if (!infos.setContent(content, true, &errorStr, &errorLine, &errorColumn))
        {
            qDebug() << "Erreur d'analyse du fichier de session";
            qDebug() << content;  return;
        }
     
        QDomElement element = infos.documentElement();
        for(QDomNode n = element.firstChild();
        !n.isNull();
        n = n.nextSibling())
        {
            QDomElement e = n.toElement();
            qDebug() << e.tagName() << e.text();
     
            if(e.tagName() == "connecte")
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
     
                //verif_httpAction->setVisible(true); // ou bien verif_httpAction->setEnabled(true); <- ça c'est correct
                if(verif_httpAction->isVisible())// <-ça c'était juste pour l'exemple, as tu bien compris ce que ça fait? à chaque fois que tu l'appelle ça affiche l'action si elle ne l'était pas, ou la masque si elle était affichée.
                {
                    verif_httpAction->setVisible(false);
                }
                else
                {
                    verif_httpAction->setVisible(true);
                }
            }
        }
    }
    et tu l'appelle où la fonction affiche ?

    Est-ce que ton code pour vérifier que tu es connecté fonctionne ? Parce que si il fonctionne, il n'y a vraiment rien de compliqué à rendre visible l'action dans ton menu, du moins je ne vois pas où est le problème...

    Je me répète mais la seule chose que tu as à faire pour rendre l'action visible c'est:
    verif_httpAction->setVisible(true), (depuis la classe Tool bien sûr).

    Donc si ton traitement pour déterminer si tu es connecté est dans ta classe Tool (ce qui est à priori pas l'idéal), tu n'as rien de plus à faire.

    Si tu veut le faire depuis l'extérieur de la classe Tool, soit tu fait une fonction publique comme dans mon post précédent, soit tu fait un slot

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2014, 09h23
  2. [AC-2010] Afficher des images dans un état selon une condition
    Par Benez dans le forum VBA Access
    Réponses: 6
    Dernier message: 31/07/2012, 15h13
  3. [XL-2007] Affiche un mot dans une cellule selon une phrase.
    Par Neptune64 dans le forum Excel
    Réponses: 3
    Dernier message: 28/09/2011, 23h02
  4. Réponses: 11
    Dernier message: 06/06/2008, 10h56
  5. Réponses: 14
    Dernier message: 30/05/2006, 16h55

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