Personalizzato QAction / QMenu per il rilevamento pulsante del mouse
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?
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();
}