【发布时间】:2014-06-21 19:33:33
【问题描述】:
我已经为我的自助服务终端应用程序制作了一个自定义虚拟键盘小部件,现在我希望它生成假键盘事件并将它们提供给选择的 QLineEdit。
我执行以下操作:
// target is the QWidget to receive the events
// k is the Qt::Key (keycode) I want to send (Testing with an 'A')
Qt::Key k=Qt::Key_A;
if(0!=target){
//According to docs this will be freed once posted
QKeyEvent * press=new QKeyEvent(QKeyEvent::KeyPress, (int )k,0);
QKeyEvent * release=new QKeyEvent(QKeyEvent::KeyRelease, (int )k,0);
//Give the target focus just to be sure it is available for input
target->setFocus();
//Post the events (queue up and let the target consume them when the eventloop gets around to the target)
QCoreApplication::postEvent ( target, press) ;
QCoreApplication::postEvent ( target, release) ;
}
我看到目标小部件获得焦点,但没有像我预期的那样在输入字段中输入字母。我究竟做错了什么?哪些假设是错误的?
PS:我知道这可以通过使用现有的虚拟键盘或至少使用平台接口来解决,就像在this post 中所做的那样。在我们的方法中,我们决定将 kayboard 构建到应用程序中,以获得对 UX 和键盘设计的完全控制。
谢谢!
【问题讨论】:
-
你看过Qt的Virtual Keyboard框架吗?
-
一般来说,我推荐阅读这个主题:qtcentre.org/archive/index.php/t-2463.html
-
是的,我们有,但是正如我在问题中提到的,我们正在寻找一个非常紧密集成的解决方案。我们的键盘将作为小部件放置在应用程序内的特定位置,并将包含与要编辑的特定字段相关的专用键。我们还需要完全控制键盘何时出现。我也认为这个问题本身就是相关的; Qt5 中如何伪造键盘事件?
-
感谢您的一般评论!非常有用!
-
您是否也阅读了该主题?具体来说,用于处理按键以生成文本的各种 Qt 小部件所使用的数据不是
key值,而是text值,您目前将其留空。但普遍的共识是,对于一个成熟的虚拟键盘/鼠标,你最好实现一个实际上与底层操作系统机制(例如 VK 框架)集成的解决方案,而不是试图重新发明轮子。当你做你正在做的事情时,你实际上并没有触发系统范围的按键事件,因此可能不会发生预期的行为。
标签: qt5 keyboard-events