Frage

Ich füge ein paar QActions 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 QActions 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 ...

War es hilfreich?

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top