在Qt中,如何显示键盘快捷菜单,但禁用它们?
-
19-09-2019 - |
题
我添加了一堆QAction
s的到我的主窗口中的菜单。这些操作也可以通过键盘触发,和我想要的快捷方式菜单中可以看到,像往常一样,例如
-----------------
|Copy Ctrl+C|
-----------------
我可以使用QAction.setShortcut()
做到这一点。然而,我的不希望这些QAction
s通过快捷键触发;我处理所有的键盘输入单独别处。
这是可能的?我可以禁用的QAction快捷,但仍然有快捷的文字(在本例<大骨节病>控制骨节病> + <大骨节病> C 骨节病>)在我的菜单?
修改:我最后做它连接到菜单的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的任何事件::快捷发送到你的行动,以不触发“触发()”信号。
其他提示
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