如何重新定义内置键盘快捷键的行为?

Posted

技术标签:

【中文标题】如何重新定义内置键盘快捷键的行为?【英文标题】:How can I redefine a built in keyboard shortcut's behavior? 【发布时间】:2009-05-28 00:41:37 【问题描述】:

我正在尝试重新实现 QTextEdit 对象的复制行为。单击“复制”按钮时,我创建的自定义上下文菜单按预期工作,但 Ctrl + C 未正确处理。由于上下文菜单没有任何问题,我将省略这部分代码。

// Create a text edit box for text editing
QTextEdit text_edit_box = new QTextEdit(getBaseWidget());

text_edit_copy_action = new QAction(QString("Copy"), getBaseWidget());
text_edit_copy_action->setShortcut(QKeySequence::Copy);

// Add custom copy action to the text edit box to ensure Ctrl+C uses our copy
// implementation
text_edit_box->addAction(text_edit_copy_action);

当我将快捷方式设置为未使用的组合键(例如,Ctrl + Q)时,它可以正常工作。似乎 Ctrl + C 的处理方式有所不同,因为它是“内置”的。

【问题讨论】:

【参考方案1】:

副本不是虚拟的,因此这可能会出现问题。复制是通过私有文本控制 API 处理的,并且不容易访问。最好的方法可能是为文本编辑安装一个事件处理程序,并在复制键事件被传递到文本控件 processEvent 处理程序之前拦截它 - 这应该允许您自己的操作正确触发。

【讨论】:

【参考方案2】:

根据新行为是什么,从QTextEdit 派生并重新实现QTextEdit::copy() 可能更简单。

【讨论】:

【参考方案3】:

我建议创建一个事件过滤器并将其安装在基本小部件(甚至是 QApplication 实例)上。您可以使用事件过滤器查看关键事件,并希望在其他地方处理之前看到 Ctrl+C 事件。

当您遇到要处理的 Ctrl + C 事件时,请确保接受该事件以防止它被进一步传播。

【讨论】:

正如我所说 - 除非您实际上需要“捕获”它,否则它将被传递到文本控件并作为普通副本处理

以上是关于如何重新定义内置键盘快捷键的行为?的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义Visual Studio快捷方式

如何使用键盘快捷键运行Gulp任务

电脑快捷键怎么设置

电脑快捷键如何设置

电脑怎么设置快捷键?

如何自定义键盘的功能