QT에서는 메뉴에서 키보드 바로 가기를 표시하지만 비활성화하는 방법은 무엇입니까?
-
19-09-2019 - |
문제
나는 많은 무리를 추가하고 있습니다 QAction
내 메인 창의 메뉴에 s. 이러한 동작은 키보드에 의해 트리거 될 수 있으며 평소와 같이 메뉴에서 바로 가기가 표시되기를 원합니다.
-----------------
|Copy Ctrl+C|
-----------------
나는 이것을 사용하여 할 수있다 QAction.setShortcut()
. 그러나 나는 ~하지 않다 이것들을 원합니다 QAction
s는 바로 가기에 의해 트리거 될 것입니다. 모든 키보드 입력을 다른 곳에서 별도로 처리하고 있습니다.
이게 가능해? 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();
}
제휴하지 않습니다 StackOverflow