Pregunta

Estoy intentando crear un menú emergente, donde puedo detectar el botón del ratón que se presionó para un elemento dado. He creado un QAction personalizada ya construir mi QMenu, pero la señal triggered cuando se presiona el elemento de menú no proporciona una QMouseEvent para mí para consultar el botón pulsado.

Además, estoy estableciendo el estado de una punta para cada QAction, que aparece en la barra de estado cuando el cursor sobre ella, pero se mantiene incluso después de cerrar el QMenu. ¿Es este comportamiento normal?

¿Fue útil?

Solución

No estoy seguro de si he entendido lo que quieres; pero si usted quiere mostrar un menú emergente al hacer clic con el ratón, que en un primer momento en el archivo de encabezado de su función de anulación widgets (o clase de ventana) relacionada con eventos de ratón y debe declarar alguna función que mostrará su menú emergente. Por lo tanto, el archivo de cabecera debe contener estas declaraciones:

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

Y en CPP definiciones de archivo de funciones:

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

Ahora, al pulsar el botón derecho del ratón, aparecerá un menú emergente aparecerá en la posición del cursor. Espero que esto ayude.

NOTA: Si desea detectar cuál de los botones del ratón se presiona cuando se elige una acción, debe heredar su propia clase de QMenu. clase QMenu contiene mousePressEvent(QMouseEvent *event) función protegida que debería ser sobreescrito y usted será capaz de detectar si se pulsa el botón izquierdo o derecho del ratón cuando se elige un elemento del menú.

Otros consejos

Sé que esto es un post muy antiguo. Pero si quieres saber qué botón se ha hecho clic en un menú emergente / menú contextual. Digamos que usted pulsa el botón Guardar, que está conectado con las señales y ranuras etc. En la llamada ranura de un método llamado sender();. Esto devuelve una QObject que se puede echar en su QAction* y obtener los datos de ella, etc.

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top