2009-12-12 4 views
5

Aggiungo un po 'di QAction ai menu della mia finestra principale. Queste azioni possono anche essere attivate dalla tastiera e voglio che la scorciatoia sia visibile nel menu, come al solito, ad es.In Qt, come mostrare le scorciatoie da tastiera nel menu ma disabilitarle?

----------------- 
|Copy  Ctrl+C| 
----------------- 

Posso farlo utilizzando QAction.setShortcut(). Tuttavia, I non desidera che questi QAction s vengano attivati ​​dalle scorciatoie; Sto gestendo tutti gli input da tastiera separatamente altrove.

È possibile? Posso disabilitare il collegamento in QAction ma ho ancora il testo di scelta rapida (in questo esempio Ctrl + C) nei miei menu?

EDIT: Il modo in cui ho finito per fare si connetta alla aboutToShow() e aboutToHide() eventi del menu, e abilitare/disabilitare i tasti di scelta rapida in modo che siano attivi solo quando viene visualizzato il menu. Ma mi farebbe piacere una soluzione più pulita ...

+1

Solo per amor di interesse, perché sono di manovrare in tutta l'input da tastiera da qualche altra parte? –

risposta

8

Si potrebbe ereditare da QAction e sovrascrivere QAction :: evento (QEvent *):

class TriggerlessShortcutAction : public QAction 
{ 
public: 
    ...ctors... 

protected: 
    virtual bool event(QEvent* e) 
    { 
     if (e->type() == QEvent::Shortcut) 
      return true; 
     else 
      return QAction::event(e); 
    } 
}; 

Questo farà sì che tutti gli eventi di tipo QEvent :: Shortcut inviato alle tue azioni per non attivare i segnali 'triggered()'.

+0

Oppure, ancora meglio, usa un filtro eventi invece di una sottoclasse. – andref

+0

Sfortunatamente né la sottoclasse né il filtro eventi funzionano per me; QAction non sta ricevendo un QShortcutEvent. Potrebbe trattarsi di un'interazione con qualche altra parte del programma, cercherò di scoprirlo. Nel frattempo sono tornato alla mia soluzione originale ... –

+0

L'ho provato su Windows e ha funzionato. magari provare a farlo in un nuovo progetto, potrebbe essere un problema di piattaforma ... –

4
action.setText("Copy\tCtrl+C"); 

Apparirà come un'azione con una scorciatoia, ma il collegamento non è attualmente installato.

Ecco un esempio completo:

#include <QtGui> 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    QMainWindow win; 

    QMenu *menu = win.menuBar()->addMenu("Test"); 

    // This action will show Ctrl+T but will not trigger when Ctrl+T is typed. 
    QAction *testAction = new QAction("Test\tCtrl+T", &win); 
    app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit())); 
    menu->addAction(testAction); 

    // This action will show Ctrl+K and will trigger when Ctrl+K is typed. 
    QAction *quitAction = new QAction("Quit", &win); 
    quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K); 
    app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit())); 
    menu->addAction(quitAction); 

    win.show(); 

    return app.exec(); 
} 
+0

Questo, infatti, installa il collegamento (Qt 4.6, mac) –

+0

Con l'esempio sopra, Ctrl + T esce dall'applicazione su un Mac? Con Qt 4.6 su Windows e Linux, Ctrl + T non attiva l'azione. – baysmith