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 contextuel et dock


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par défaut Menu contextuel et dock
    Bonjour,

    je fais un programme avec une IHM en QT réalisée avec QT Designer et utilisant des docks.

    J'ai créé chaque dock sur une form différente du designer et dans mon code source j'ai créé pour chaque dock une classe qui dérive de QMainWindow auquel j'ai fait un setupUi() de la form contenant le dock. Ca marche.

    Maintenant je veux ajouter un menu contextuel différent pour chaque dock sans avoir à dériver la classe QDockWidget puisque je les ai créé dans le designer.

    J'ai essayé d'utiliser le signal customContextMenuRequested de ma classe dérivé de QMainWindow sur lequel je fais mon setupUi() de la form du dock. Le slot est bien appelé mais le problème c'est que le QPoint reçu en argument du slot semble être exprimé en coordonnée local de mon dock (ou de la form contenant mon dock). Donc mon menu s'affiche en haut à gauche de l'écran et non pas à la position de la souris.
    Et mapToGlobal() ne m'a pas aidé.

    Donc je ne sais pas comment faire.

  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
    Citation Envoyé par greg2 Voir le message
    J'ai essayé d'utiliser le signal customContextMenuRequested de ma classe dérivé de QMainWindow sur lequel je fais mon setupUi() de la form du dock. Le slot est bien appelé mais le problème c'est que le QPoint reçu en argument du slot semble être exprimé en coordonnée local de mon dock (ou de la form contenant mon dock). Donc mon menu s'affiche en haut à gauche de l'écran et non pas à la position de la souris.
    Et mapToGlobal() ne m'a pas aidé.

    Donc je ne sais pas comment faire.
    1- tu peut connaitre la widget appelant avec la fonction sender() et un cast
    http://qt.developpez.com/doc/4.5/qobject/#sender

    2- installer un filtre
    http://qt.developpez.com/doc/4.5/qob...alleventfilter
    et capter l'événement correspondant. http://qt.developpez.com/doc/4.5/qcontextmenuevent/

    Je ne sais pasa trop ce qui est le plus propre. Je dirais le deuxième.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par défaut
    Mais mon problème n'est pas de savoir qui m'envoie le message, mais plutôt comment afficher mon menu au bon endroit ( menu.exec(position); )

    Le problème viens peut-être du fait que mon dock appartient à une form qui n'est pas la form principale de l'application.
    Les coordonnée reçu sont sûrement définit en fonction de la position du dock dans sa form et non pas en fonction de la position du dock dans la QMainWindow dans laquelle il est ajouté (et qui appartient à une autre form). C'est dommage.

    J'ai l'impression que mon seul moyen est de dériver la classe QDockWidget ???

  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 greg2 Voir le message
    Mais mon problème n'est pas de savoir qui m'envoie le message, mais plutôt comment afficher mon menu au bon endroit ( menu.exec(position); )
    Ben justement, si tu veut retrouver la position, tu as besoin de connaître la widget.
    La point est dans le repère widget. Si tu te situe dans un autre repère que celui d'origine, comment peut tu retrouver la position exacte de ton point?

  5. #5
    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
    Voici un exemple avec eventFilter
    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
     
    #include <QtGui>
    #include <iostream>
     
    class myWindow :public QMainWindow
    {
    public :
        myWindow()
        {
            setCentralWidget(new QTextEdit);
        }
     
        bool eventFilter ( QObject * watched, QEvent * event )  
        {
            //si l'event est pour un ContextMenu
            if (event->type() == QEvent::ContextMenu)
            {
                QWidget* w = qobject_cast<QWidget*>(watched);
                //si watched est une QWIdget
                if (w)
                {
                    //cast méchant mais l'on as déjà tester si l'event est déjà un QContextMenuEvent
                    QContextMenuEvent * ev = (QContextMenuEvent *)event;
     
                    //je créé mon menu
                    QMenu menu;
                        menu.addAction ("tu");
                        menu.addAction ("va");
                        menu.addAction ("bien ?");
                    //execute le menu.
                    //mapToGlobal : transforme le point local à w en point global
                    menu.exec( w->mapToGlobal( ev->pos ()));
                    return true;
                }
            }
           QMainWindow::eventFilter(watched, event);
     
        }
    };
     
     
    int main(int argc, char **argv) {
    	QApplication app(argc, argv);
        myWindow w;
        for (int i =0 ; i<10 ; ++i)
        {
            QDockWidget * dock = new QDockWidget(QString::number(i));
                QLabel * label = new QLabel(QString::number(i));
                label->installEventFilter(&w);
                dock->setWidget(label);
            w.addDockWidget(Qt::LeftDockWidgetArea,dock);
        }
     
        w.show();
    	return app.exec();
    }
    [edit]
    le QContextMenuEvent donne déjà le point global
    http://qt.developpez.com/doc/4.4/qco...ent/#globalpos

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par défaut
    Merci. Ca semble marcher.

+ 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