Qt 5 中的屏幕键盘

Onscreen Keyboard in Qt 5

本文关键字:屏幕 键盘 Qt      更新时间:2023-10-16

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

  1. Qt5中QInputContext的替换是什么?(因为我通过实现QInputContext在某处读到了有关屏幕键盘的信息,但Qt 5不支持。

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

我的要求:

  1. 键盘不会使用 QML 或任何外部库(已经构建其他键盘)。

  2. 键盘将使用Qt Gui(繁体)。

我知道你会面临两个挑战:

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

  1. 至于前者,您可以在要为其提供键盘服务的小部件上使用QObject::InstallEventFilter()。然后,您可以按照链接中的Qt代码行查找mouseReleaseEvent
  2. 这可以通过使用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构建)