我想为桌面应用程序创建一个屏幕键盘。该应用程序将在Qt 5中构建。我有几个问题,请澄清它们。
Qt5中QInputContext
的替换是什么? (因为我通过实现QInputContext
来阅读有关屏幕键盘的某处,但Qt 5不支持此。)
我在哪里可以找到QPlateformInputContext
& QInputPanel
(在互联网搜索中,我发现这两个作为QInputContext
的替代品但不确定,我也找不到它们?
我的要求:
答案 0 :(得分:2)
我知道你会遇到两个挑战:
<强> ANSWER 强>
QObject::InstallEventFilter()
。然后,您可以在链接中的Qt代码行中查找mouseReleaseEvent
。QCoreApplication::postEvent()
至于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获得一个实例,就像我上面那样。
希望有所帮助。