Qt-如何为菜单和小部件中的操作设置快捷上下文
我有一些全局菜单操作附在主菜单栏上(以下示例中的“缩放”)。此外,我还将动作附加到某些小部件上(以下示例中的“Zoom2”) 我想对这两个操作使用相同的快捷方式。它应该是这样工作的:Qt-如何为菜单和小部件中的操作设置快捷上下文,qt,shortcut,Qt,Shortcut,我有一些全局菜单操作附在主菜单栏上(以下示例中的“缩放”)。此外,我还将动作附加到某些小部件上(以下示例中的“Zoom2”) 我想对这两个操作使用相同的快捷方式。它应该是这样工作的: 如果聚焦了textEdit2,则其操作应使用快捷方式(即应触发zoom2()) 否则,菜单快捷方式应处于活动状态,触发zoomGlobal() 下面的当前示例还不起作用:如果聚焦了textEdit2,Qt通知QAction::eventFilter:不明确的快捷方式重载:Ctrl++,但不执行任何操作 Main
- 如果聚焦了
,则其操作应使用快捷方式(即应触发textEdit2
)zoom2()
- 否则,菜单快捷方式应处于活动状态,触发
zoomGlobal()
textEdit2
,Qt通知QAction::eventFilter:不明确的快捷方式重载:Ctrl++
,但不执行任何操作
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QAction *act = menuBar()->addAction("Zoom");
act->setShortcut(QKeySequence("Ctrl++"));
connect(act, SIGNAL(triggered(bool)), this, SLOT(zoomGlobal()));
setCentralWidget(new QWidget());
QVBoxLayout *layout = new QVBoxLayout();
centralWidget()->setLayout(layout);
QTextEdit *textEdit1 = new QTextEdit();
layout->addWidget(textEdit1);
QTextEdit *textEdit2 = new QTextEdit();
layout->addWidget(textEdit2);
act = new QAction("Zoom2");
act->setShortcut(QKeySequence("Ctrl++"));
act->setShortcutContext(Qt::WidgetShortcut);
connect(act, SIGNAL(triggered(bool)), this, SLOT(zoom2()));
textEdit2->addAction(act);
}
无论是否有另一个shorcut与contextWindowShortcut
或ApplicationShortcut
,聚焦小部件都有办法窃取并使用快捷方式吗
当然,可以在
zoomGlobal()
中对所有内容进行编码,检查哪个小部件处于活动状态,并委托给它执行操作。但是,如果您有许多操作和小部件,那么这将非常麻烦。我希望能够添加/删除/更改诸如textededit2
之类的小部件,而无需在zoomGlobal()
中调整代码。我遇到了与您相同的问题。为了解决这个问题,您在QShortcut类中使用了一个技巧
在示例代码中,您希望“textEdit2”在具有焦点时窃取全局快捷方式。这段代码应该可以做到这一点,它适合我:
QTextEdit* textEdit2 = new QTextEdit();
layout->addWidget(textEdit2);
QShortcut* shortcutStealer = new QShortcut(
QKeySequence("Ctrl++"), //the key sequence to steal
textEdit2, //the shortcut's parent
SLOT(zoom2()), //triggered when shortcut activated
SLOT(zoom2()), //triggered when shortcut ambiguously activated!
Qt::WidgetShortcut); //context of shortcut
希望这是明确的,并帮助你。亲切的问候 经过两个多小时的搜索和尝试,我完全不知道如何在没有全局检查的情况下完成。在全局快捷方式事件期间,必须检查
textededit2
是否处于活动状态。这还不错,因为你的程序当然不会有很多这样的对,而且检查很简单)@VladimirBershov:谢谢你的工作。其实,以上只是一个很小的例子。实际的程序有几个小部件,如textededit2
,每个小部件都有多个(和不同的)快捷方式。我不能认真介绍全局检查。如果有什么不同的话,我们必须围绕这一点编写一个框架。所有小部件和操作都必须在那里注册,并且框架必须委托。但我希望有另一种方法。请注意,这是一个奇怪的例子。我对你的主要项目一无所知,但这种代码的平静看起来很糟糕——没有信息的变量名,它们只在数字上有所不同,在代码中创建UI元素,奇怪的一行setCentralWidget(newQWidget())代码>。全局检查不是问题,它可以像其他任何东西一样封装在一个类中。这实际上只是一个测试的最小示例(您可以创建一个项目并粘贴上面的代码作为工作示例)。您可以将其视为代码编辑器textEdit1
和其他相关小部件textEdit2
。“在代码中创建UI元素”:我觉得这没什么错。“奇怪的行setCentralWidget(新的QWidget());”:这只是一个可以设置布局的容器。“全局[…]可以封装在一个类中”:这就是我所说的框架。我感觉到了你们的痛苦,我也有这个问题。当然,必须执行全局ckecks是可能的,但是在您的情况下,在一个具有大量小部件/快捷方式的实际应用程序中,需要一个相当大的框架。真不明白,关于这件事的报道太少了!