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

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

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

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

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

  1. Клавиатура не будет использовать QML или какую-либо внешнюю библиотеку (уже создаются другие клавиатуры).

  2. Клавиатура будет использовать Qt Gui (традиционный).


person Jai    schedule 24.09.2013    source источник


Ответы (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);
}

Подсказка здесь заключается в том, что нажатие кнопок (если вы вручную создадите свою клавиатуру) запускает событие отправки для текущего объекта, который имеет фокус (например, текстовое поле). Конечно, вы можете жестко запрограммировать текстовое поле, но это работает только в том случае, если у вас есть только один ввод для использования клавиатуры.

Последнее, что вам нужно сделать, это установить для параметра focusPolicy кнопок клавиатуры значение NoFocus, чтобы предотвратить смещение фокуса при нажатии на клавиатуру.

Кредиты идут на https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/

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

person Arnout    schedule 27.07.2017
comment
Кажется, что использование QKeySequence(key).tostring() не всегда дает желаемые результаты, в частности, использование его для букв всегда кажется заглавным. - person plugwash; 05.11.2019

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

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

ОТВЕТ

  1. Что касается первого, вы можете использовать QObject::InstallEventFilter() на виджетах, которым вы хотите предоставить службу клавиатуры. Затем вы можете найти mouseReleaseEvent. по строкам кода Qt в ссылке.
  2. Этого можно добиться с помощью QCoreApplication::postEvent().

Что касается QPlatformInputContext, возьмите пример виртуальная клавиатура Qt здесь.

person user1055604    schedule 26.09.2013
comment
Для автоматического скрытия я использовал сигнал focusChanged (QWidget * old, QWidget * new) QApplication. Так что не нужно писать дополнительно для ввода текста. Он отлично работает и является универсальным. - person Jai; 09.04.2014

Хороший пример приведен здесь http://tolszak-dev.blogspot.com.tr/2013/04/qplatforminputcontext-and-virtual.html использует Qt Quick для экранной клавиатуры. Вы можете проверить это.

person Fatih Özlü    schedule 23.01.2015
comment
Хорошая находка! Он поставляется с полным исходным кодом на Github. - person tanius; 19.07.2020

Я только что получил это в своем замечательном приложении 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 мало что говорят о том, как получить к нему доступ из С++. Вы должны получить экземпляр из QGuiApplication, как я сделал выше.

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

person phyatt    schedule 07.09.2014

Qt теперь предоставляет виртуальную клавиатуру в Qt 5.5.

http://doc.qt.io/QtVirtualKeyboard/

Я не пробовал, поэтому не могу сказать, насколько это удобно. Похоже, он основан на QML.

(Написано, что это для Linux и boot2qt, но его также можно собрать для Windows в соответствии со страницей сборки (http://doc.qt.io/QtVirtualKeyboard/build.html))

person michaelmoo    schedule 08.12.2015
comment
Следует отметить, что QtVirtualKeyboard лицензируется либо на коммерческой основе, либо через GPL, в отличие от остальной части Qt, что может помешать людям использовать его. - person FourtyTwo; 14.11.2017