En Qt, la forma de mostrar los atajos de teclado en el menú, pero desactivarlos?
-
19-09-2019 - |
Pregunta
Estoy agregando un montón de QAction
s a los menús de mi ventana principal. Estas acciones también pueden ser provocados por el teclado, y quiero que el acceso directo a ser visible en el menú, como es habitual, por ejemplo,
-----------------
|Copy Ctrl+C|
-----------------
Puedo hacer esto utilizando QAction.setShortcut()
. Sin embargo, me No quieren estos QAction
s a ser provocados por los atajos; Estoy manejo de toda la entrada de teclado separado en otro lugar.
¿Es esto posible? ¿Puedo desactivar el acceso directo en el QAction pero todavía tiene el texto de acceso directo (en este ejemplo Ctrl + C ) en los menús de mi?
Editar : La forma en que terminé haciendo que se conecta a eventos aboutToShow()
y aboutToHide()
del menú, y la activación / desactivación de los accesos directos por lo que sólo están activos cuando se muestra el menú. Pero te agradecería una solución más limpia ...
Solución
Se puede heredar de QAction y anular 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);
}
};
Esto hará que cualquier evento de tipo QEvent :: acceso directo enviado a sus acciones para no desencadenar las señales disparadas '()'.
Otros consejos
action.setText("Copy\tCtrl+C");
Esto se verá como una acción con un acceso directo, pero el acceso directo no está instalada.
Este es un ejemplo 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();
}