Экранная клавиатура в Qt 5
Я хочу создать виртуальную клавиатуру для настольного приложения. Приложение будет построено в Qt 5. У меня есть пара вопросов, пожалуйста, уточните их.
Что такое замена
QInputContext
в Qt5? (Потому что я где-то читал о onscreen keybord, реализуяQInputContext
но это не поддерживается Qt 5.)где я могу найти
QPlateformInputContext
&QInputPanel
(в интернет-поиске я нашел эти две альтернативыQInputContext
но не уверен в этом, а также я не смог их найти)?
мои требования:
- клавиатура не будет использовать QML или любую внешнюю библиотеку (уже строить другие клавиатуры)
- клавиатура будет использовать Qt Gui (традиционный)
5 ответов
Я взял меня довольно долго, чтобы узнать, как это сделать в 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 к текущему объекту, который имеет фокус (например, текстовое поле). Вы можете, конечно, hardcode текстовое поле, но это работает, только если у вас есть только один вход для использования клавиатуры.
последнее, что вы должны убедиться, является установите focusPolicy кнопок клавиатуры в NoFocus, чтобы предотвратить смещение фокуса при нажатии клавиатуры.
кредиты идут в https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/
надеюсь, это кому-то поможет.
Я понимаю, что у вас есть две проблемы:
- получение уведомления о том, когда показывать / скрывать экранную клавиатуру, на основе фокуса на текстовые виджеты
- как опубликовать ключ-нажмите событие в текстовых виджетах
ответ
- Что касается первого, вы можете использовать
QObject::InstallEventFilter()
на виджетах, которым вы хотите предоставить услугу клавиатуры. Затем вы можете искатьmouseReleaseEvent
по строкам кода Qt в ссылке. - это может быть достигнуто с помощью
QCoreApplication::postEvent()
как QPlatformInputContext
, получить пример Виртуальная Клавиатура Qt здесь.
хороший пример приведен здесь 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, как я сделал выше.
надеюсь, что это поможет.