Em Qt, como mostrar os atalhos de teclado no menu, mas desativá-los?
-
19-09-2019 - |
Pergunta
Eu estou adicionando um monte de QAction
s 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 QAction
s 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 ...
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();
}