Qt 5中的屏幕键盘

时间:2013-09-24 10:25:03

标签: c++ qt qt5 on-screen-keyboard

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

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

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

  3. 我的要求:

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

5 个答案:

答案 0 :(得分:2)

我知道你会遇到两个挑战:

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

  3. <强> ANSWER

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

      至于QPlatformInputContext,请在此处获取Qt Virtual Keyboard的示例。

答案 1 :(得分:1)

这里给出了一个很好的例子http://tolszak-dev.blogspot.com.tr/2013/04/qplatforminputcontext-and-virtual.html 在屏幕键盘上使用Qt Quick。 你可以查一下。

答案 2 :(得分:1)

Qt现在在Qt 5.5中提供虚拟键盘框架。

http://doc.qt.io/QtVirtualKeyboard/

我没有尝试过,所以我不能说它是多么容易使用。它看起来像是基于QML的。

(它说它适用于Linux和boot2qt,但也可以根据构建页面(http://doc.qt.io/QtVirtualKeyboard/build.html)为Windows构建)

答案 3 :(得分:1)

我花了很长时间才找到如何在没有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。您当然可以对文本框进行硬编码,但只有在您只有一个输入才能使用键盘时才能使用。

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

积分转到https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/

希望这有助于某人。

答案 4 :(得分:0)

我刚刚在我真棒的Qt应用程序中工作了。我就是这样做的。

对于Android和iOS:

QObject::connect(lineEdit, SIGNAL(returnPressed()), qApp->inputMethod(), SLOT(hide()));

对于iOS:

子类QLineEdit并添加以下内容:

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获得一个实例,就像我上面那样。

希望有所帮助。