Я хочу создать экранную клавиатуру для настольного приложения. Приложение будет встроено в Qt 5. У меня есть пара вопросов, пожалуйста, уточните их.
Что такое замена QInputContext
в Qt5? (Потому что я где-то читал о экранной клавиатуре, реализуя QInputContext
но это не поддерживается Qt 5.)
Где я могу найти QPlateformInputContext
& QInputPanel
(в интернет-поиске я нашел эти два в качестве альтернативы QInputContext
но не уверен в этом, а также я не смог их найти)?
Мои требования:
Я потратил довольно много времени, чтобы выяснить, как сделать это в 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);
}
Подсказка заключается в том, что, нажимая кнопки (если вы вручную создаете клавиатуру), запускается отправка текущего объекта, который имеет фокус (например, текстовое поле). Конечно, вы можете жестко закодировать текстовое поле, но это работает, только если у вас есть только один вход, для которого вы хотите использовать клавиатуру.
Последнее, что вы должны убедиться, это установить focusPolicy кнопок клавиатуры на NoFocus, чтобы предотвратить смещение фокуса при нажатии клавиатуры.
Кредиты идут в https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/
Надеюсь, это кому-нибудь поможет.
Я понимаю, что у вас есть две проблемы:
ОТВЕТ
QObject::InstallEventFilter()
на виджетах, которым вы хотите предоставить сервис клавиатуры. Затем вы можете посмотреть на mouseReleaseEvent
вдоль линий кода Qt в ссылке.QCoreApplication::postEvent()
Что касается QPlatformInputContext
получить пример Qt Virtual Keyboard Вот.
Хороший пример приведен здесь http://tolszak-dev.blogspot.com.tr/2013/04/qplatforminputcontext-and-virtual.html
использует Qt Quick для экранной клавиатуры.
Вы можете проверить это.
Qt теперь предоставляет платформу виртуальной клавиатуры в Qt 5.5.
http://doc.qt.io/QtVirtualKeyboard/
Я не пробовал, поэтому не могу сказать, насколько легко им пользоваться. Похоже, он основан на QML.
(В нем говорится, что это для Linux и boot2qt, но его также можно собрать для Windows в соответствии со страницей сборки (http://doc.qt.io/QtVirtualKeyboard/build.html))
Я только что получил это работает в моем удивительном приложении 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, как я сделал выше.
Надеюсь, это поможет.