Domanda

Sto cercando di creare un menu a comparsa, dove posso rilevare il pulsante del mouse che è stato premuto per un determinato elemento. Ho creato un QAction personalizzato già a costruire la mia QMenu, ma il segnale triggered quando la voce di menu viene premuto non fornisce un QMouseEvent per me, per interrogare il tasto premuto.

Inoltre, sto impostando l'una punta di stato per ogni QAction, che appare nella barra di stato quando mi mouse su di esso, ma rimane anche dopo che chiudo il QMenu. È questo un comportamento normale?

È stato utile?

Soluzione

Non sono sicuro se ho capito cosa vuoi; ma se si desidera visualizzare un menu a comparsa sul tasto destro del mouse, si dovrebbe in un primo momento nel file di intestazione della funzione di override widget di (o classe di finestra) relativi a eventi del mouse e dichiarare una funzione che vi mostrerà il vostro menu a comparsa. Quindi, il file di intestazione deve contenere queste dichiarazioni:

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

E in cpp definizioni di file di funzioni:

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)
    {
    }
}

Ora, quando si preme il pulsante destro del mouse, apparirà un menu a comparsa nella posizione del cursore. Spero che questo aiuta.

Nota: se si desidera rilevare che dei pulsanti del mouse viene premuto quando si sceglie un'azione, si dovrebbe ereditare la propria classe da QMenu. Classe QMenu contiene funzione protetta mousePressEvent(QMouseEvent *event) che dovrebbe essere ignorato e sarete in grado di rilevare se si preme il tasto sinistro o destro del mouse quando un elemento viene scelto nel vostro menu.

Altri suggerimenti

So che questo è un post molto vecchio. Ma se volete sapere quale pulsante è stato fatto clic in un menu a comparsa / menu contestuale. Diciamo che si preme il pulsante Salva, che è collegato con i segnali e gli slot, ecc nella fessura chiamata un metodo chiamato sender();. Ciò restituisce un QObject che si può lanciare nella vostra QAction* e ottenere i dati da esso, ecc.

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top