Question

Je suis en train de créer un menu contextuel, où je peux détecter le bouton de la souris qui a été pressé pour un élément donné. J'ai créé un QAction personnalisé déjà pour construire mon QMenu, mais le signal de triggered lorsque l'élément de menu est pressée ne fournit pas une QMouseEvent pour moi d'interroger le bouton enfoncé.

En outre, je suis le réglage de la pointe d'état pour chaque QAction, qui apparaît dans la barre d'état lorsque la souris I dessus, mais il reste même après que je ferme la QMenu. Est-ce normal?

Était-ce utile?

La solution

Je ne sais pas si je comprends bien ce que vous voulez; mais si vous voulez afficher un menu contextuel sur clic droit de la souris, vous devez tout d'abord dans le fichier d'en-tête de votre widget (ou classe de fenêtre) fonction de priorité liée à l'événement de la souris et de déclarer une fonction qui affichera le menu contextuel. Ainsi, le fichier d'en-tête doit contenir ces déclarations:

...
void Popup(const QPoint& pt);
void mousePressEvent(QMouseEvent *event);
...

Et dans les définitions de fichiers cpp de fonctions:

void testQt::mousePressEvent(QMouseEvent *event)
{
     if (event->button() == Qt::RightButton) {

         this ->Popup(event ->pos());
         event->accept();
     }
 }

void testQt::Popup(const QPoint& pt)
{
    QPoint global = this ->mapToGlobal(pt);
    QMenu* pPopup = new QMenu(this);

    QAction* pAction1 = new QAction("Item 1", this);
    QAction* pAction2 = new QAction("Item 2", this);
    pPopup ->addAction(pAction1);
    pPopup ->addAction(pAction2);

    QAction* pItem = pPopup ->exec(global);

    if(pItem == pAction1)
    {
    }
    else if(pItem == pAction2)
    {
    }
}

Maintenant, lorsque vous appuyez sur le bouton droit de la souris, un menu contextuel apparaît à la position du curseur. J'espère que cela aide.

NOTE: Si vous voulez détecter lequel des boutons de la souris est pressée lorsqu'une action est choisie, vous devez hériter votre propre classe de QMenu. classe QMenu contient la fonction mousePressEvent(QMouseEvent *event) protégée qui devrait être surchargée et vous serez en mesure de détecter si le bouton gauche de la souris ou la droite est enfoncée lorsqu'un élément est choisi dans le menu.

Autres conseils

Je sais que c'est un très ancien poste. Mais si vous voulez savoir ce que vous avez cliqué sur le bouton dans le menu contextuel d'un menu / contexte. Disons que vous appuyez sur le bouton Enregistrer, qui est connecté avec les signaux et les créneaux horaires, etc. Dans l'appel à sous une méthode appelée sender();. Cette fonction renvoie une QObject que vous pouvez jeter dans votre QAction* et obtenir les données, etc. de lui.

void MyClass::showMenu()
{
     auto action(new QAction*("Blah", ui->my_toolbar));

     QObject::connect(action, &QAction::triggered, this, &MyClass::mySlot);
}

void MyClass::mySlot()
{
     auto myAction(static_cast<QAction*>(sender()));
     myAction->doAwesomeStuff();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top