Pergunta

Eu estou adicionando um monte de QActions para menus meu principal da janela. Essas ações também podem ser acionados pelo teclado, e eu quero o atalho para ser visível no menu, como de costume, por exemplo,

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

Eu posso fazer isso usando QAction.setShortcut(). No entanto, I não quiser que essas QActions para ser desencadeada por os atalhos; Eu estou lidando com toda a entrada de teclado separadamente em outro lugar.

Isso é possível? Posso desativar o atalho na QAction mas ainda tem o texto de atalho (neste exemplo Ctrl + C ) em meus menus?

Editar : A maneira que eu acabei fazendo ele está se conectando aboutToShow() e aboutToHide() eventos do menu e ativar / desativar os atalhos para que eles só estão activas quando o menu é exibido. Mas eu apreciaria uma solução mais limpa ...

Foi útil?

Solução

Você pode herdar de QAction e substituir 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);
    }
};

Este irá causar quaisquer eventos do tipo QEvent :: Atalho enviado para suas ações para não provocar os sinais 'desencadeadas ()'.

Outras dicas

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

Esta será parecido com uma ação com um atalho, mas o atalho não está realmente instalado.

Aqui está um exemplo 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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top