如何根据当前键盘布局从 QKeyEvent 捕获 QKeySequence?
我需要这样做来配置我的应用程序。 我有 QLineEdit 字段和重新实现的 keyPressEvent 方法。
QKeyEvent *ke = ...
QString txt;
if(ke->modifiers() & Qt::ControlModifier)
txt += "Ctrl+";
if(ke->modifiers() & Qt::AltModifier)
txt += "Alt+";
if(ke->modifiers() & Qt::ShiftModifier)
txt += "Shift+";
if(ke->key() >= Qt::Key_0 && ke->key() <= Qt::Key_9)
txt += ('0' + ke->key() - Qt::Key_0);
else if(ke->key() >= Qt::Key_A && ke->key() <= Qt::Key_Z)
txt += ('A' + ke->key() - Qt::Key_A);
ui->hotkeyEdit->setText(txt);
但该解决方案只能使用英文字符创建快捷方式。例如,当我使用俄语键盘布局时,此代码将显示相同的序列,但使用英语字符,放置在同一键盘键上。
I need to do this for configuring my application.
I have QLineEdit field with reimplemented keyPressEvent method.
QKeyEvent *ke = ...
QString txt;
if(ke->modifiers() & Qt::ControlModifier)
txt += "Ctrl+";
if(ke->modifiers() & Qt::AltModifier)
txt += "Alt+";
if(ke->modifiers() & Qt::ShiftModifier)
txt += "Shift+";
if(ke->key() >= Qt::Key_0 && ke->key() <= Qt::Key_9)
txt += ('0' + ke->key() - Qt::Key_0);
else if(ke->key() >= Qt::Key_A && ke->key() <= Qt::Key_Z)
txt += ('A' + ke->key() - Qt::Key_A);
ui->hotkeyEdit->setText(txt);
But this solution can create shortcuts only with english chars. For example when I use russian keyboard layout, this code will display the same sequence but with english char, placed on the same keyboard key.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可能会发现函数
QKeySequence().toString()
非常有用。以下是我用来捕获用户定义的快捷方式的代码的一部分。通过一些修改,它可以完成您项目中需要的任何操作。希望它能有所帮助(抱歉,我的识别很糟糕):
What you might find very useful is the function
QKeySequence().toString()
.The following is a part of a code that I use to capture User Defined Shortcuts. With some modifications it can do whatever you need in your project. Hope it helps (sorry for the crapped identation):
如果有人关心上面 Tihomir Dolapchiev 解决方案的 python 版本。我刚刚翻译了它,效果很好。只是发布以供将来参考。
If someone cares for the python version of the solution of Tihomir Dolapchiev above. I just translated it and it works great. Just posting for future reference.
您可以为操作分配键盘快捷键。
这里有一些方法可以做到这一点。
或者您可以使用此定义自己的快捷方式
在第一种情况下,qt 会自动检测并为该特定操作分配适当的快捷方式。在第二种情况下,您可以选择自己想要的快捷方式并将其输入为字符串。它会自动解析并理解它。
这避免了将关键捕获用于不必要的目的的需要。
You can assign keyboard shortcuts to actions.
Here are someways to do it.
or you can define your own shortcut with this
In the first case qt automatically detects and assigns the appropriate shortcut for that particular action. In the second case, you can pick your own desired shortcut and type it as string. It automatically parses it and understands.
This avoids the need for using key captures for unnecessary purposes.
首选标准序列。
来自键盘布局问题:
Prefer a standard seqence.
From the Keyboard Layout Issues:
最简单的方法是:
simpliest way is:
如果 Qt 用户想要 Qml,我是这样做的。
然而,有一些您可能不想要的额外功能。我将把代码留在这里,让用户适应。
in case Qt users want it for Qml, here's how I did it.
There are however a few extra features that you might not want. I'll leave the code here and let users adapt.
尝试在 keyPressEvent 中捕获 QKeySequence 可能无法按预期工作。我找到了一个解决方案:
我希望对某人有所帮助。 :)
参考: QWidget::eventFilter()没有捕获组合键
Trying to capture a QKeySequence in keyPressEvent might not work as expect. And I found a solution:
I hope that helps someone. : )
Reference: QWidget::eventFilter() not catching key combinations