Экранная клавиатура в Qt 5

Я хочу создать виртуальную клавиатуру для настольного приложения. Приложение будет построено в Qt 5. У меня есть пара вопросов, пожалуйста, уточните их.

  1. Что такое замена QInputContext в Qt5? (Потому что я где-то читал о onscreen keybord, реализуя QInputContext но это не поддерживается Qt 5.)

  2. где я могу найти QPlateformInputContext & QInputPanel (в интернет-поиске я нашел эти две альтернативы QInputContext но не уверен в этом, а также я не смог их найти)?

мои требования:

  1. клавиатура не будет использовать QML или любую внешнюю библиотеку (уже строить другие клавиатуры)
  2. клавиатура будет использовать 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/

надеюсь, это кому-то поможет.


Я понимаю, что у вас есть две проблемы:

  1. получение уведомления о том, когда показывать / скрывать экранную клавиатуру, на основе фокуса на текстовые виджеты
  2. как опубликовать ключ-нажмите событие в текстовых виджетах

ответ

  1. Что касается первого, вы можете использовать QObject::InstallEventFilter() на виджетах, которым вы хотите предоставить услугу клавиатуры. Затем вы можете искать mouseReleaseEvent по строкам кода Qt в ссылке.
  2. это может быть достигнуто с помощью 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, как я сделал выше.

надеюсь, что это поможет.