Dans Qt, comment afficher les raccourcis clavier dans le menu mais les désactiver?
-
19-09-2019 - |
Question
J'ajoute un tas de QAction
s aux menus de ma fenêtre principale. Ces actions peuvent également être déclenchées par le clavier, et je veux que le raccourci soit visible dans le menu, comme d'habitude, par exemple
-----------------
|Copy Ctrl+C|
-----------------
Je peux le faire en utilisant QAction.setShortcut()
. Cependant, I ne pas veulent que ces QAction
s à être déclenchées par les raccourcis; Je manipuler toutes les entrées du clavier séparément ailleurs.
Est-ce possible? Puis-je désactiver le raccourci dans le QAction mais encore le texte de raccourci (dans cet exemple Ctrl + C ) dans mes menus?
EDIT : La façon dont je fini par le faire se connecte aux événements aboutToShow()
et aboutToHide()
du menu et activer / désactiver les raccourcis afin qu'ils ne sont actifs que lorsque le menu est affiché. Mais je vous en serais reconnaissant une solution plus propre ...
La solution
Vous pouvez hériter de QAction et passer outre QAction :: event (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);
}
};
Cela entraînera des événements de type QEvent :: raccourci envoyé à vos actions pour ne pas déclencher les « déclenchées () » signaux.
Autres conseils
action.setText("Copy\tCtrl+C");
Cela ressemblera à une action avec un raccourci, mais le raccourci est pas réellement installé.
Voici un exemple complet:
#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();
}