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 :

[Qt 4.4.3]tags : Menu contextuel - contextMenuEvent - popup miniscule


Sujet :

Qt

  1. #1
    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 [Qt 4.4.3]tags : Menu contextuel - contextMenuEvent - popup miniscule
    Bonjour,

    j'ai besoin de mettre un menu contextuel pour une classe dérivant de QDockWidget.
    Dans cette classe, j'ai les membres suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QMenu *contextMenu;
    QAction *aMotorStep;
    QAction *aMillimeters;
    J'ai crée une fonction createMenus() qui comme son nom l'indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void myDockValues::createMenus()
    {
    	contextMenu = new QMenu(this);		// On cree le menu
     
    	// Creation des actions (entrées de menu)
    	aMotorStep = new QAction(tr("Pas moteurs"), this);
    	aMotorStep->setCheckable(true);
    	aMillimeters = new QAction(tr("Millimètres"), this);
    	aMillimeters->setCheckable(true);
    }
    Pour faire apparaître le menu contextuel, j'ai alors surchargé la méthode contextMenuEvent(QContextMenuEvent *event) (partie en violet) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void monDock::contextMenuEvent(QContextMenuEvent *event)
    {
    /*
    	QMenu menu(this);		// Méthode qui marche
    	menu.addAction(aMotorStep);
    	menu.addAction(aMillimeters);
    	menu.exec(event->globalPos());     // Méthode qui marche
    */
    	contextMenu->exec(event->globalPos());     // Méthode qui marche pas
    }
    à l'éxécution, j'ai un petit carré de deux pixels de côté qui apparait, c'est tout.
    Par contre, si je construit mon menu à l'intérieur de contextMenuEvent (partie en rouge) là ça fonctionne.

    Qu'est-ce que je n'ai pas saisi ? c'est lié aux "events" ?

    tags : Menu contextuel - contextMenuEvent - popup miniscule
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  2. #2
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Dans createMenus() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    contextMenu->addAction(aMotorStep);
    contextMenu->addAction(aMillimeters);
    Ca devrait t'aider ?
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  3. #3
    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
    ôh la honte pour moi !

    J'aurais pas dû venir au boulot aujourdhui, je suis trop malade !
    Je me suis fait avoir, j'ai aussi un QActionGroup pour lequel j'ai bien fait addAction, et vu que je me relis trop rapidement, j'ai pas percuté que j'avais pas ajouté au menu !

    Bon, c'est pas grave, ça servira ptêtre à d'autres encore plus malades que moi
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Juste pour mentionner qu'il y a une façon plus simple de créer un menu contextuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	this->addAction(action1);
    	this->addAction(action2);
    	this->setContextMenuPolicy(Qt::ActionsContextMenu);
    ca t'évites d'avoir à surcharger contextMenuEvent()...
    ca peut bien aider au cas ou tu utilises une QDockWidget originale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	dockWidget->addAction(action1);
    	dockWidget->addAction(action2);
    	dockWidget->setContextMenuPolicy(Qt::ActionsContextMenu);

  5. #5
    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
    Effectivement, en allant regarder la doc j'ai vu que addAction y était, ainsi que setContextMenuPolicy. J'y avais testé en premier lieu, mais comme l'autocomplétion ne me le proposait pas ... ne jamais se fier à Intellisense
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  6. #6
    Membre du Club Avatar de Dodin
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2009
    Messages : 104
    Points : 66
    Points
    66
    Par défaut
    Bonjour à tous.

    J'ai trouvé ceci sur le web qui à marché du tonnerre pour moi donc je le post en pensant que cela pourra aider d'autre personne :

    Donc par exemple dans le man.ccp vous mettez :

    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
     
     
    //set le menu contextuel
    w->setContextMenuPolicy(Qt::CustomContextMenu);
    //on fait le connect
    connect(w, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(MenuContext(const QPoint &)));
     
    //vous rajoutez cette méthode permettant le rajout du menu contextuel
    //puis le recalage des coordonnées
     
    void mainwindows::MenuContext(const QPoint &pos) {
        QMenu *menu = new QMenu;
        menu->addAction(tr("Test Item"), this, SLOT(test_slot()));
        menu->exec(w->mapToGlobal(pos));
    }
    Pour moi w étant une GraphicsView.

    Donc dans ma GraphicsView dans ma méthode qui gère les events souris je rajoute un petit "setContextMenuPolicy(Qt::CustomContextMenu);" et voila ça fonctionne !

    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
     
     
    void QOgreGraphicsView::mousePressEvent( QMouseEvent * event )
    {
        if( event->button() == Qt::LeftButton )
        {
            //sauvegarde coord clic pour la position de mon image
            clicCoordX = event->x();
            clicCoordY = event->y();
            //lancé de rayon pour la sélection
            qOgreGLWidget_Ptr()->rayTracingForBoundingBox( event->x() , event->y() );
        }
     
        if( event->button() == Qt::RightButton )
        {
            qDebug()<<"AHAHAHAH CLIC DROIT";
            this->setContextMenuPolicy(Qt::CustomContextMenu);
     
        }
    }
    Bonne journée à vous.

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

Discussions similaires

  1. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  2. Visibilité commande dans un Menu contextuel
    Par Hamdi dans le forum IHM
    Réponses: 3
    Dernier message: 20/01/2005, 12h29
  3. [Plugin] Ajouter une option au menu contextuel ?
    Par relivio dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 22/03/2004, 16h18
  4. [VB6] menu contextuel dynamique
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/07/2003, 11h53
  5. [VB6] menu contextuel sur clique droit souris
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 08/07/2003, 11h07

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