我想为桌面应用程序创建一个屏幕键盘。该应用程序将在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构建)