Qt 5 中的屏幕键盘
Onscreen Keyboard in Qt 5
我想为桌面应用程序创建一个屏幕键盘。该应用程序将在Qt 5中构建。我有几个问题,请澄清一下。
-
Qt5中
QInputContext
的替换是什么?(因为我通过实现QInputContext
在某处读到了有关屏幕键盘的信息,但Qt 5不支持。 -
我在哪里可以找到
QPlatformInputContext
和QInputPanel
(在互联网搜索中,我发现这两个作为QInputContext
的替代品,但不确定,也找不到它们)?
我的要求:
-
键盘不会使用 QML 或任何外部库(已经构建其他键盘)。
-
键盘将使用Qt Gui(繁体)。
我知道你会面临两个挑战:
- 根据文本小部件的焦点获得有关何时显示/隐藏屏幕键盘的通知
- 如何将按键事件发布到文本小部件
答
- 至于前者,您可以在要为其提供键盘服务的小部件上使用
QObject::InstallEventFilter()
。然后,您可以按照链接中的Qt代码行查找mouseReleaseEvent
。 - 这可以通过使用
QCoreApplication::postEvent()
来实现
至于QPlatformInputContext
,请在此处获取Qt虚拟键盘的示例。
我花了很长时间才了解如何在没有 qml 和太多工作的情况下在 QT5 中做到这一点。所以我想我会分享:
#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);
}
这里的线索是,通过单击按钮(如果您手动制作键盘),会向具有焦点的当前对象(例如文本框)启动 sendevent。您当然可以对文本框进行硬编码,但这仅在只有一个输入可以使用键盘时才有效。
您必须确保的最后一件事是将键盘按钮的焦点策略设置为 NoFocus,以防止在按下键盘时焦点移动。
积分归 https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/
希望这对某人有所帮助。
这里给出了一个很好的例子 http://tolszak-dev.blogspot.com.tr/2013/04/qplatforminputcontext-and-virtual.html使用Qt Quick作为屏幕键盘。你可以检查一下。
我刚刚在我很棒的Qt应用程序中工作。 这是我是如何做到的。
对于安卓和iOS:
QObject::connect(lineEdit, SIGNAL(returnPressed()), qApp->inputMethod(), SLOT(hide()));
对于 iOS:
子类 QLine编辑并添加以下内容:
void focusOutEvent(QFocusEvent * fe)
{
QLineEdit::focusOutEvent(fe);
#ifdef Q_OS_IOS
if(fe->reason() == Qt::OtherFocusReason)
{
// Done was pressed!
emit returnPressed();
}
#endif
}
顺便说一句,QInputMethod 文档并没有说明如何从 c++ 访问它。 你必须从QGuiApplication获取一个实例,就像我上面所做的那样。
希望有帮助。
Qt现在在Qt 5.5中提供了一个虚拟键盘框架。
http://doc.qt.io/QtVirtualKeyboard/
我没有尝试过,所以我不能说它有多容易使用。 它看起来像是基于QML的。
(它说它是针对Linux和boot2qt的,但它也可以根据构建页面(http://doc.qt.io/QtVirtualKeyboard/build.html)为Windows构建)
- 物理键盘上的触发器按键
- 如何使用C/C++在MacOSX中获得键盘布局
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 视窗键盘输入 c++
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- Winapi:屏幕截图未显示在窗口中
- 如何在快板的屏幕中显示子位图的绘制?
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- C ++异步键盘输入(标准方式)
- 键盘不起作用 - Arduino Uno - 与变量有关的多个错误
- 显示和隐藏Windows 10屏幕键盘(osk.exe)时遇到问题
- 捕获Linux/Ubuntu(屏幕捕获 鼠标/键盘事件)中的窗口事件
- C++ & WinApi - 在创建的窗口中将文本从键盘输出到屏幕
- Qt 5 中的屏幕键盘
- 如何从键盘打字屏幕上的快板
- 如何等待键盘输入之前清除屏幕(getchar不工作)
- 可以为屏幕键盘获得物理键盘布局
- 如何用c++在屏幕键盘上关闭窗口