2009-10-15 19 views
14

In un'applicazione Qt, ho un sacco di QActions (voci di menu) create automaticamente che aggiungo a un menu nella barra dei menu. Ciascuno apre un file diverso. Mi piacerebbe collegarli tutti allo stesso slot in modo da non scrivere lo stesso codice molte volte. Da quello slot, però, come faccio a capire quale dei QActions è stato attivato?Capire quale voce di menu è stata attivata in Qt

(Esempio:. In Cacao farei questo con il parametro del mittente nel selettore azione)

Grazie!

risposta

13

Sono disponibili due opzioni:

  • chiamata sender() nella fessura, che restituirà l'azione che ha attivato il segnale.
  • Utilizzare QSignalMapper.
+0

Grazie! QObject :: sender() sembra sufficiente per il caso che ho chiesto, ma è utile conoscere l'opzione QSignalMapper più generale. – Geoff

+2

Inoltre, è possibile utilizzare QObject :: setProperty() su QAction per trasferire ulteriori dati per articolo nello slot. – Geoff

+2

'QAction :: setData' è probabilmente migliore di' QObject :: setProperty'. –

10

In Qt, si ha anche accesso al mittente: QObject::sender.

+4

Esattamente - nello slot che si può fare qualcosa di simile: QAction * pAction = qobject_cast (mittente()); – Thomi

16

Mi collegherei al segnale "attivato" di QMenu, piuttosto che a ogni QAction. Questo ti dà la QAction su cui è stato fatto clic come primo parametro.

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

Mi piacerebbe vederlo aggiornato con la nuova sintassi signal/slot .... – neuronet

Problemi correlati