Qt 5中的屏幕键盘

Jai*_*Jai 7 c++ qt on-screen-keyboard qt5

我想为桌面应用程序创建一个屏幕键盘.该应用程序将在Qt 5中构建.我有几个问题,请澄清它们.

  1. 什么是QInputContextQt5 的替代品?(因为我通过实现读取了关于屏幕键盘的某处,QInputContext但Qt 5不支持这种情况.)

  2. 我在哪里可以找到QPlateformInputContext&QInputPanel(在互联网搜索中我发现这两个作为替代QInputContext但不确定,而且我也找不到它们)?

我的要求:

  1. 键盘不会使用QML或任何外部库(已经构建其他键盘)
  2. 键盘将使用Qt Gui(传统)

use*_*604 5

我知道您将面临两个挑战:

  1. 根据文本小部件的焦点,获得有关何时显示/隐藏屏幕键盘的通知
  2. 如何将按键事件发布到文本小部件

回答

  1. 对于前者,您可以QObject::InstallEventFilter()在要为其提供键盘服务的小部件上使用。mouseReleaseEvent然后,您可以在链接中查找Qt 代码的相关内容。
  2. 这可以通过使用来实现QCoreApplication::postEvent()

至于,请在此处获取Qt 虚拟键盘QPlatformInputContext的示例。


Arn*_*out 4

我花了很长时间才找到如何在 QT5 中做到这一点,而不需要 qml 和太多的工作。所以我想分享一下:

#include <QCoreApplication>
#include <QGuiApplication>
#include <QKeyEvent>

void MainWindow::on_pushButton_clicked()
{
   Qt::Key key = Qt::Key_1;;

   QKeyEvent pressEvent = QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString());
   QKeyEvent releaseEvent = QKeyEvent(QEvent::KeyRelease, key, Qt::NoModifier);
   QCoreApplication::sendEvent(QGuiApplication::focusObject(), &pressEvent);
   QCoreApplication::sendEvent(QGuiApplication::focusObject(), &releaseEvent);
}
Run Code Online (Sandbox Code Playgroud)

这里的线索是,通过单击按钮(如果您手动制作键盘),向当前具有焦点的对象(例如文本框)启动 sendevent。您当然可以对文本框进行硬编码,但这仅在您只有一个输入可使用键盘时才有效。

您必须确保的最后一件事是将键盘按钮的 focusPolicy 设置为 NoFocus,以防止按下键盘时焦点移动。

学分请访问https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/

希望这对某人有帮助。