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

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

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

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

Действительно ли это возможно? Я могу отключить ярлык в QAction, но все еще иметь текст ярлыка (в этом примере Ctrl + C) в моих меню?

Править: Путем я закончил тем, что делал, это соединяется с меню aboutToShow() и aboutToHide() события и включение/отключение ярлыков, таким образом, они только активны, когда меню показывают. Но я ценил бы более чистое решение...

5
задан Jasper 11 September 2011 в 18:01
поделиться

2 ответа

You could inherit from QAction and override 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);
    }
};

This will cause any events of type QEvent::Shortcut sent to your actions to not trigger the 'triggered()' signals.

8
ответ дан 13 December 2019 в 05:36
поделиться
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();
}
4
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: