QT에서는 메뉴에서 키보드 바로 가기를 표시하지만 비활성화하는 방법은 무엇입니까?

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

문제

나는 많은 무리를 추가하고 있습니다 QAction내 메인 창의 메뉴에 s. 이러한 동작은 키보드에 의해 트리거 될 수 있으며 평소와 같이 메뉴에서 바로 가기가 표시되기를 원합니다.

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

나는 이것을 사용하여 할 수있다 QAction.setShortcut(). 그러나 나는 ~하지 않다 이것들을 원합니다 QActions는 바로 가기에 의해 트리거 될 것입니다. 모든 키보드 입력을 다른 곳에서 별도로 처리하고 있습니다.

이게 가능해? QAction에서 바로 가기를 비활성화 할 수 있지만 여전히 바로 가기 텍스트가 있습니다 (이 예에서는 Ctrl 키 + ) 내 메뉴에서?

편집하다: 내가 끝내는 방식은 메뉴에 연결하는 것입니다. aboutToShow() 그리고 aboutToHide() 이벤트, 단축키를 활성화/비활성화하여 메뉴가 표시 될 때만 활성화됩니다. 하지만 더 깨끗한 솔루션에 감사드립니다 ...

도움이 되었습니까?

해결책

QAction에서 상속하고 QACTION :: 이벤트를 재정의 할 수 있습니다 (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 :: 바로 가기 유형의 모든 이벤트가 귀하의 동작으로 전송되어 '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