我在主窗口的菜单中添加了一堆QAction
个。这些动作也可以由键盘触发,我希望快捷方式在菜单中可见,像往常一样,例如,
-----------------
|Copy Ctrl+C|
-----------------
我可以使用QAction.setShortcut()
执行此操作。但是,我不希望快捷方式触发这些QAction
;我正在别处处理所有键盘输入。
这可能吗?我可以在QAction中禁用快捷方式,但我的菜单中仍然有快捷方式文本(在此示例中为 Ctrl + C )?
编辑:我最终的做法是连接菜单的aboutToShow()
和aboutToHide()
事件,并启用/禁用快捷方式,以便它们仅在菜单显示。但我很欣赏一个更清洁的解决方案...
答案 0 :(得分:8)
您可以继承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()'信号。
答案 1 :(得分:4)
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();
}