In Qt, wie Tastenkombinationen in Menüs zeigen, sondern sie deaktivieren?
-
19-09-2019 - |
Frage
Ich füge ein paar QAction
s zu meinem Hauptfenster Menü. Diese Aktionen können auch über die Tastatur ausgelöst werden, und ich möchte, dass die Verknüpfung im Menü sichtbar sein, wie üblich, z.B.
-----------------
|Copy Ctrl+C|
-----------------
Das kann ich QAction.setShortcut()
mit tun. Allerdings I nicht wollen diese QAction
s durch die Verknüpfungen ausgelöst werden; Ich bin Umgang mit alle Tastatureingabe separat an anderer Stelle.
Ist das möglich? Kann ich die Verknüpfung im QAction deaktivieren, aber immer noch die Verknüpfung Text hat (in diesem Beispiel Strg + C ) in meinem Menü?
Bearbeiten : Die Art, wie ich tun, landete es auf dem Menü des aboutToShow()
und aboutToHide()
Ereignisse verbindet, und Aktivieren / Deaktivieren Sie die Verknüpfungen, so dass sie nur dann aktiv, wenn das Menü angezeigt wird. Aber ich würde eine sauberere Lösung zu schätzen wissen ...
Lösung
Sie können von QAction erben und überschreiben QAction :: Ereignis (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);
}
};
Dadurch werden alle Ereignisse des Typs QEvent verursachen :: Verknüpfung zu Ihrer Aktionen geschickt, um die ‚ausgelöst ()‘ Signale nicht aus.
Andere Tipps
action.setText("Copy\tCtrl+C");
Das ist wie eine Aktion mit einer Verknüpfung aussehen wird, aber die Verknüpfung nicht tatsächlich installiert ist.
Hier ist ein vollständiges Beispiel:
#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();
}