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 :

Menu et QVector


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut Menu et QVector
    Salut a tous,

    Alors je vous explique ce que je veux faire :
    J'ai edité un fichier xml avec une certaine hierarchie, contenant des menus et les éléments de ces menus, sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Menu  >
     <element>
         <nom></nom>
         <path></path>
     </element>
      <element>
         <nom></nom>
         <path></path>
     </element>
    </Menu>
    Je veux maintenant créer un menu dans lequel il y aura chaque élément de ce fichier xml. Je me sers du nom pour afficher dans le menu, et à l'aide du path je lance ce que contient le menu ( document ou raccourci vers application) à l'aide d'un StartDetached.

    Cependant voila, pour chaque élément de mon menu, je dois créer une action,
    que j'utiliserais lors de la création de mon Qmenu (avec Addaction).

    La seule solution pour créer plusieurs actions (le même nombre que celui d'éléments) que j'ai trouvée, c'est un QVector<QAction *>.

    Lorsque je crée une action, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QVector<QAction *> list;
    list.append(new QAction((nom),this));
    Et pour ajouter une action à un menu, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int j=0;j<=i;j++)    // i est mon nombre d'actions crées, je fais un menu   avec i actions.
     
         {
         menu.addAction(list[j]);
        }

    Le problème est la : lorsque le menu devrait s'afficher : "prog.exe a cessé de fonctionner" ...... Cela vient surement de mon appel a list[i] dans addaction, mais je ne vois pas ou ni pourquoi ??

    Merci pour vos réponses

  2. #2
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Salut,

    Citation Envoyé par clem_69 Voir le message
    for(int j=0;j<=i;j++)
    Je crois que c'est la journée des gens qui ne savent pas écrire de for

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    salut irmatDen,

    heuuu, j'vois pas trop le soucis dans mon for??? a par mettre ++i à la place de i ++ ?

  4. #4
    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
    Citation Envoyé par clem_69 Voir le message
    salut irmatDen,

    heuuu, j'vois pas trop le soucis dans mon for??? a par mettre ++i à la place de i ++ ?
    for(int j=0;j<=i;j++)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    oui bon excusez moi je suis un boulet...... Merci à vous deux.
    Mais je me demande quand même si mon appel à mon QVector lorsque je crée mon menu est correct.....

  6. #6
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    L'appel est bon; qu'est ce qui cloche maintenant?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    le menu se crée, mais il est vide, il ne contient aucune action ....

  8. #8
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Ben vérifie que tu parses quelque chose pour commencer.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    bizarre j'ai recompilé 2-3 fois en enlevant et remettant des morceaux de programme tout en vérifiant que je parsais bien quelque chose, et maintenant sa marche !!!

    Merci en tout cas!

    Juste une dernière petite chose: lorsque je fais mes actions, en parallèle, je fais des connect pour associer à chaque action un processus à éxécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //path est une Qstring contenant le chemin de l'executable à lancer
    connect(list[i],SIGNAL(triggered()),this,SLOT(Launch(path)));
    J'ai donc une methode Launch qui a pour argument une QString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MainWindow::Launch(QString prog)
     {
    	QString cmd = "cmd";
    	QStringList args;
    	args << "/c"<< "start"<<prog;
    	QProcess proc;
    	proc.startDetached( cmd, args );
     
    	}
    C'est pas tres optimisé mais sa me permet aussi bien d'ouvrir un document qu'une application via la console windows.
    Mais dans mon menu, rien ne se passe au clic d'un élément.....
    une idée d'ou cela vient?

  10. #10
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Oui, on ne passe jamais d'arguments dans un connect. Regarde du côté de QSignalMapper, c'est exactement ce qu'il te faut.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    ah merci beaucoup c'est exactement ce que je veux faire. La doc est pas évidente je vois pas ou je dois mettre mon Launch en fait ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QAction *act = list[i];
    				connect(act,SIGNAL(triggered()),signalMapper,SLOT(map()));
     
    signalMapper->setMapping(act, list[i]);
     
    }	...
     connect(signalMapper, SIGNAL(mapped(const QString &)),
                 this, SIGNAL(triggered(const QString &)));
    J'ai codé sa, en m'inspirant de l'exemple de la doc, je vais essayer de trouver ou mettre le SLOT que je veux faire

  12. #12
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Lorsque le signal mapper émet le signal mapped, ça veut dire que l'une des actions a été "triggered" (déclenchée quoi). Hors, le mapping que t'as écrit ne rime à rien: ce que tu veux récupérer c'est le path, alors pourquoi faire un mapping sur un QAction* ?!!

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    hum alors j'ai pas vraiment compris le fonctionnement d'un QSignalMapper..... Faut que j'approfondisse, même si j'avoue que sa rime pas à grand chose ce que j'ai fait

  14. #14
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Ben, tu voulais passer le path de l'action... Il te le permet directement en utilisant setMapping(act, path)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    oui oui c'est vrai, en fait j'avais confondu, je croyais que je ne pouvais pas mettre une action contenue dans un tableau dans le connect .... Bref

    J'ai fait un code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QString path=grandChild.text();
    QAction *act = list[i];
    				connect(list[i],SIGNAL(triggered()),signalMapper,SLOT(Launch()));			
    signalMapper->setMapping(act, path);
    connect(act,SIGNAL(triggered()),signalMapper,SLOT(map()));
     
    connect(signalMapper, SIGNAL(mapped(const QString &)),this,
    SIGNAL(triggered(const QString &)));
    Ce code compile, mais malheureusement ne marche pas, en plus je peine à trouver des exemples utilisables sur le net .... qu'est ce qui cloche ?

    Merci d'avance...

  16. #16
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Comme ça, dur à dire... T'aurais pas une signature de slot incorrecte qui traîne? Active la console pour avoir éventuellement plus d'infos (CONFIG += console dans le pro).

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    Qu'est ce que tu entends par signature de slot incorrecte ? quand je met la console dans mon fichier pro, sa ne compile plus (undefined reference to winmain...)

  18. #18
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Citation Envoyé par clem_69 Voir le message
    Qu'est ce que tu entends par signature de slot incorrecte ? quand je met la console dans mon fichier pro, sa ne compile plus (undefined reference to winmain...)
    Hannn, je suis aveugle ces jours ci:
    connect(signalMapper, SIGNAL(mapped(const QString &)),this, SIGNAL(triggered(const QString &)));

    Relis ce snippet. Si tu ne vois toujours pas, lis celui-ci:
    connect(signalMapper, SIGNAL(mapped(const QString &)),this, SIGNAL(triggered(const QString &)));


    Bon, au passage, si ajouter console à la CONFIG génère des erreurs, ton install Qt est foireuse. Mais c'est un autre sujet ça

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 47
    Par défaut
    super lol c un SLOT qu'il faut ....

    AHHH merde alors lol mon install Qt est foireuse, bizarres jamais eu de soucis jusqu'à maintenant lol !



    edit : non ce n'est pas le SLOT qui fait que cela ne marche pas

  20. #20
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Bon, poste le .h et le .cpp associé...

    En parallèle va voir sur google avec les erreurs que t'as quand tu utilises la console.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  3. Menu d'installation
    Par Le Yannos dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2002, 22h15
  4. Inserer Un Menu dans un autre en execution
    Par apt dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 11h22
  5. Menu en GL
    Par Kaïn dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/05/2002, 11h58

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