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 :

créer une bar de menu


Sujet :

Qt

  1. #21
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Deja, je pense qu'il serait bon que les noms de tes classes commencent par une Majuscule. MaClasse maVariable. Ca évite les confusions, et avec certains langages/compilateurs, c'est nécessaire. Autant prendre de bonnes habitudes.

    Ensuite, as tu essayé d'utiliser le même type entre la déclaration de ton pointeur, et l'instanciation de ton objet ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    menuBar * mainbar = new menuBar();
     
    au lieu de : 
     
    QMenuBar * mainbar = new menuBar();
    En lisant ton message de compilation, on voit bien que ton constructeur menuBar renvoir un "int *" que tu associes à un "QMenuBar *". As tu essayé de caster ?

    Il y a plein de choses que je ne comprends pas dans ton code, mais ça vient peut être de moi. Par contre j'ai l'impression que tu fais parfois une confusion entre un QMenu et un QMenuBar.
    En effet, dans ton menuBar.cpp, à ce que je comprends, tu définis 3 QMenus, mais je ne vois nul part la création d'une QMenuBar dans laquelle tu as ajouté les 3 QMenus que tu as crées.

    Je te conseille d'analyser l'exemple du MDI donné par Qt.

    Bonne chance,

    G.

    Sinon, il est souvent plus malin de déclarer toutes ses variables et pointeurs dans le header (.h) d'une classe.

  2. #22
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Sinon, il est souvent plus malin de déclarer toutes ses variables et pointeurs dans le header (.h) d'une classe.
    Euh non, surtout pas. Il y a des cas où il faut, et d'autres ou ce n'est pas nécessaire.

  3. #23
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    Tu est un dieu IrmatDen

    j'ai toujours le chic pour prendre les nom de variable réservé !
    Du coup je l'ai renommer ma class en PhpwriterMenuBar comme tu me conseillait avec le nom de l'appli ! (encore une fois )

    et effectivement j'ai le problème pour les actions et je suis toute ouïe a ton ecoute.

    je me punirait plus tard ()

  4. #24
    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 IrmatDen Voir le message
    Râââh, mais quel idiot de pas y avoir pensé avant...

    menuBar() est une fonction membre de QMainWindow. Donc forcément ça pouvait pas compiler... Change donc le nom de ta classe. Après ça y'aura un paquet d'erreurs sur les actions, mais c'est normal. Je vais expliquer le raisonnement auquel je pense un peu plus tard, j'ai pas le temps tout de suite.
    Citation Envoyé par Mongaulois Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menubar = new menuBar()
    tu as nommé ta variable comme ta class... pas bien

    moi je dit que c'était pas loin

  5. #25
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Euh non, surtout pas. Il y a des cas où il faut, et d'autres ou ce n'est pas nécessaire.
    Peut tu expliquer les cas ou il faut et ceux ou il faut pas ?

  6. #26
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Mongaulois Voir le message

    moi je dit que c'était pas loin
    Rien à voir, et la variable a un 'b' minuscule, c'est légal (si on enlève la fonction menuBar() de QMainWindow bien sûr)

    Pour les variables locales/variables d'instance, ben, y'a pas trop de règles, c'est selon le besoin quoi... Il faut réduire la portée d'une variable au minimum qui fasse marcher l'appli pour pas bloater la déclaration d'une classe avec toutes les variables qui sont propres à chaque méthode, mais c'est un peu l'évidence même quoi :/

  7. #27
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    Oki !

    sinon est ce que tu as un peu de temps pour un exemple de la gestion des actions dans une classe le tout gérer avec des ENUM ?

  8. #28
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    Tu fais bien de le rappeller, j'avais un peu zappé

    Première suggestion: utiliser des enum.
    * avantages : typage (assez) fort, vérifiable à la compilation
    * inconvénients : structure qui oblige à un peu de redondance (maintenance d'un type enum en fait)

    Code cpp : 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
    class MySoftActions: public QObject
    {
    public:
        enum ActionRole
        {
            AR_FileNew,
            AR_FileOpen
            //...
        };
     
    public:
        MySoftActions(QObject parent = 0)
        : QObject(parent)
        {
            QAction *action;
     
            action = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
            action->setShortcut(tr("Ctrl+N"));
            action->setStatusTip(tr("Create a new file"));
            actions[AR_FileNew] = action;
     
            action = new QAction(QIcon(":/images/open.png"), tr("&Open"), this);
            action->setShortcut(tr("Ctrl+O"));
            action->setStatusTip(tr("Open a file"));
            actions[AR_FileOpen] = action;
     
            // ...
        }
     
        QAction* actionForRole(ActionRole role)
        {
            ActionMap::iterator ai = actions.find(role);
            return (ai != actions.end() ? ai.value() : 0);
        }
     
    private:
        typedef QMap<ActionRole, QAction*> ActionMap;
        ActionMap actions;
    };

    Ca, c'est la structure de base nécessaire, après tu peux l'agrémenter de petite features genre le classement d'action par leur "catégorie" (Fichier, Edition etc....) voire la recherche d'une action selon ses champs textes (nom ou status tip); mais dans longtemps, quand t'auras un soft suffisamment complexe pour avoir besoin de ça (genre 3DS, Excel et tout ces poids lourds)

    Pour la solution à base de string, c'est sensiblement pareil. Tu supprimes l'enum, tu changes la clé de la map pour une string, et c'est parti. Il n'y a pas de vérifs à la compilation possible par contre. Si tu réfléchis le code suffisamment, tu peux du coup ouvrir ton soft à des plugins plus facilement.

  9. #29
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    Oki je vois le truc, par contre je comprend pas bien le QMap !

    Et comment faire pour utiliser ces ENUM dans une fonction de class par 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
     
    #include "ma_class_action.h"
    //[...]
    PhpWriterMenuBar::PhpWriterMenuBar()
    {
        ma_class_action *MesActions = ma_class_action();
    }
    void PhpWriterMenuBar::buildMenuFichier()
    {
        menuFichier = new QMenu(this);
        //menuFichier = addMenu(trUtf8("&Fichier"));
        menuFichier->setTitle(trUtf8("&Fichier"));
        menuFichier->addAction(MesActions::AR_FileNew);
        menuFichier->addAction(MesActions::AR_FileOpen);
        menuFichier->addSeparator();
        //...
        addAction(menuFichier->menuAction());
    }
    Est ce correcte ?

  10. #30
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    1. QMap est équivalent à std::map. C'est un conteneur associatif qui prend une clé à laquelle est associée une et une seule valeur pour faire court.

    2.a. faut que les actions soient membres de classes
    2.b. la présence d'une méthode renvoyant un QAction* ne t'a pas intrigué?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menuFichier->addAction(MesActions->actionForRole(MySoftActions::AR_FileNew));

  11. #31
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    oki je te remercie encore pour tes explications.

    pour répondre au 2.b, => j'avais été distrait par le QMap et je n'avais pas vus la méthode.
    Mais maintenant que tu le dis, ça parait évidant.

    En tout cas merci ça m'a beaucoup aider.

  12. #32
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    Resalut IrmatDen

    j'ai essayer de reprendre ton exemple en le modifiant légèrement :
    j'ai fai tun fichier PhpWriterActions.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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #ifndef PHPWRITERACTIONS_H_INCLUDED
    #define PHPWRITERACTIONS_H_INCLUDED
     
     
    #include <QObject>
    #include <QAction>
    #include <QMap>
    #include <QKeySequence>
    #include <QIcon>
     
    class PhpWriterActions : public QObject
    {
    public:
        enum ActionRole
        {
            AR_FileNew,
            AR_FileOpen
        };
     
    public:
        PhpWriterActions(QObject parent = 0): QObject(parent)
        {
            QAction *action;
     
            //Nouveau fichier
            action = new QAction(QIcon(":/tool/icon/crystal/filenew.png"),trUtf8("&Nouveau","Nouveau fichier"),this);
            action->setStatusTip(trUtf8("Créer un nouveau fichier"));
            action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
            actions[AR_FileNew] = action;
     
            //Ouvrir un fichier
            action = new QAction(QIcon(":/tool/icon/crystal/fileopen.png"),trUtf8("&Ouvrir","Ouvrir un fichier"),this);
            action->setStatusTip(trUtf8("Ouvre un fichier"));
            action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O));
            actions[AR_FileOpen] = action;
     
        };
     
        QAction* actionForRole(ActionRole role)
        {
            ActionMap::iterator ai = actions.find(role);
            return (ai != actions.end() ? ai.value() : 0);
        };
     
    private:
        typedef QMap<ActionRole, QAction*> ActionMap;
        ActionMap actions;
    };
     
    #endif // PHPWRITERACTIONS_H_INCLUDED
    mais l'ors de la compilation j'ai un petit problème :
    PhpWriterActions.h:21: erreur: default argument for parameter of type «QObject» has type «int»
    /usr/local/Trolltech/Qt-4.4.0/include/QtCore/qobject.h: In constructor «PhpWriterActions:hpWriterActions(QObject)»:
    /usr/local/Trolltech/Qt-4.4.0/include/QtCore/qobject.h:295: erreur: «QObject::QObject(const QObject&)» is private
    PhpWriterActions.h:21: erreur: à l'intérieur du contexte
    make: *** [mainWindow.o] Erreur 1
    ps : je sais je suis une buse

  13. #33
    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
    Points : 3 266
    Points
    3 266
    Par défaut
    J'ai raté une étoile. C'est QObject *parent et non QObject parent.

  14. #34
    Membre habitué Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Points : 155
    Points
    155
    Par défaut
    ok ça marche je te remercie une fois de plus (pour aujourd'hui).

    Grâce a toi j'ai beaucoup progressé. Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 10
    Dernier message: 21/04/2013, 18h48
  2. Désactiver des options d'une bar de menu
    Par tupac25 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 10/11/2010, 17h07
  3. [DEV] créer une barre de menu en java style mac os X
    Par didi dans le forum Développement OS X
    Réponses: 11
    Dernier message: 31/05/2008, 00h16
  4. Créer une barre de menu commune à tous formulaires
    Par Salamander24 dans le forum IHM
    Réponses: 5
    Dernier message: 12/02/2008, 14h45
  5. Réponses: 9
    Dernier message: 24/03/2007, 22h37

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