2009-10-15 16 views
14

En una aplicación Qt, tengo un montón de QActions creadas automáticamente (elementos de menú) que agrego a un menú en la barra de menús. Cada uno abre un archivo diferente. Me gustaría conectarlos a todos en la misma ranura para no escribir el mismo código muchas veces. Desde esa ranura, sin embargo, ¿cómo averiguo cuál de las QActions se activó?Averiguar qué elemento de menú se activó en Qt

(Ejemplo:. En cacao que me gustaría hacer esto con el parámetro emisor en el selector de acción)

Gracias!

Respuesta

13

Usted tiene dos opciones:

+0

¡Gracias! QObject :: sender() parece suficiente para el caso que pregunté, pero es bueno saber acerca de la opción más general de QSignalMapper. – Geoff

+2

Además, puede usar QObject :: setProperty() en su QAction para pasar datos adicionales por elemento en su ranura. – Geoff

+2

'QAction :: setData' es probablemente mejor que' QObject :: setProperty'. –

10

En Qt, también tiene acceso al remitente: QObject::sender.

+4

Exactamente - en su ranura se puede hacer algo como esto: QAction * compactación = qobject_cast (remitente()); – Thomi

16

Me conectaría a la señal "activada" del QMenu, en lugar de cada QAction. Esto le proporciona la QAction en la que se hizo clic como primer parámetro.

void MyObject::menuSelection(QAction* action) 
{ 
    qDebug() << "Triggered: " << action->text(); 
} 

void MyObject::showMenu(QPoint menuPos) 
{ 
    QMenu menu; 
    menu.addAction("File A"); 
    menu.addAction("File B"); 
    menu.addAction("File C"); 
    connect(&menu, SIGNAL(triggered(QAction*)), this, SLOT(menuSelection(QAction*))); 
    menu.exec(menuPos); 
} 
+1

Me encantaría ver esto actualizado con nueva sintaxis de señal/ranura .... – neuronet

Cuestiones relacionadas