Как в Qt показать сочетания клавиш в меню, но отключить их?

StackOverflow https://stackoverflow.com/questions/1894395

Вопрос

добавляю кучу QActions в меню моего главного окна.Эти действия также можно запускать с помощью клавиатуры, и я хочу, чтобы ярлык был виден в меню, как обычно, например.

-----------------
|Copy     Ctrl+C|
-----------------

Я могу сделать это, используя QAction.setShortcut().Однако я не хочу этих QActions запускаться с помощью ярлыков;Я обрабатываю весь ввод с клавиатуры отдельно в другом месте.

Это возможно?Могу ли я отключить ярлык в QAction, но при этом сохранить текст ярлыка (в этом примере Ctrl + С) в моих меню?

РЕДАКТИРОВАТЬ:В итоге я подключился к меню aboutToShow() и aboutToHide() события, а также включение/отключение ярлыков, чтобы они были активны только при отображении меню.Но я был бы признателен за более чистое решение...

Это было полезно?

Решение

Вы можете наследовать от QAction и переопределить 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);
    }
};

Это приведет к тому, что любые события типа QEvent::Shortcut, отправленные на ваши действия, не будут вызывать сигналы «triggered()».

Другие советы

action.setText("Copy\tCtrl+C");

Это будет выглядеть как действие с ярлыком, но на самом деле ярлык не установлен.

Вот полный пример:

#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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top