【问题标题】:How to fake keyboard event to widget in Qt5如何在 Qt5 中将键盘事件伪造为小部件
【发布时间】: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


【解决方案1】:

由于没有人站出来,我将尝试提供一些关闭。

事实证明,Qt5 带有一个名为testlib 的测试工具库。它有各种好东西,可以方便地为 Qt 应用程序创建、管理和运行单元测试。在这些工具中,有一组用于发送虚假事件的功能,例如虚假输入文本、鼠标点击等。它非常全面,涵盖了许多用例。由于 Qt 开发人员在内部使用它来测试 Qt 本身,因此它也是经过生产验证的代码。

我只是从那里复制了我需要的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2018-08-20
    • 2011-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多