Qt 5中的屏幕键盘

11

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

  1. 在Qt5中,QInputContext的替代品是什么?(因为我在某个地方读到实现QInputContext的屏幕键盘,但是这在Qt 5中不被支持。)

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

我的要求:

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

  2. 键盘将使用Qt Gui(传统方式)。

5个回答

5
我知道您有两个挑战需要解决:
  1. 根据文本小部件的焦点,通知何时显示/隐藏屏幕键盘
  2. 如何将按键事件发布到文本小部件

答案

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

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


1
为了自动隐藏,我使用了QApplication的focusChanged(QWidget* old,QWidget* new)信号。为了将文本放入QLineEdit/QTextEdit中,我在与键盘按钮的点击信号连接的槽中发布了按键事件。因此,无需编写额外的输入文本代码。它运行良好且通用。 - Jai

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);
}

这里的提示是,通过点击按钮(如果您手动制作键盘),会向具有焦点的当前对象(例如文本框)发出sendevent。当然,您可以硬编码一个文本框,但这仅适用于您只有单个输入要使用键盘的情况。
最后一件事,您必须确保将键盘按钮的focusPolicy设置为NoFocus,以防止在按下键盘时焦点转移。
Credits go to https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/ 希望这能帮助到某些人。

似乎使用“QKeySequence(key).tostring()”并不总是产生期望的结果,特别是在字母上使用它似乎总是产生大写字母。 - plugwash

2

不错的发现!它附带有Github上的完整源代码 - tanius

1

我刚刚在我的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获取实例。

希望这可以帮到您。


1

6
需要注意的是,QtVirtualKeyboard的许可证要么是商业许可证,要么是GPL许可证,与Qt的其余部分不同,这可能会阻止人们使用它。 - FourtyTwo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接