2013-09-24 21 views
6

Chcę utworzyć klawiaturę ekranową dla aplikacji komputerowej. Aplikacja zostanie zbudowana w Qt 5. Mam kilka pytań, proszę je wyjaśnić.Klawiatura ekranowa w Qt 5

  1. Co to jest wymiana QInputContext w Qt5? (Bo czytałem gdzieś o ekranowej keybord wdrażając QInputContext ale to nie jest obsługiwany przez Qt 5.)

  2. Gdzie mogę znaleźć QPlateformInputContext & QInputPanel (po przeszukaniu internetu znalazłem te dwa jako alternatywy QInputContext ale nie jestem pewien to i nie mogłem ich znaleźć)?

Moje wymagania:

  1. klawiatura nie użyje QML ani żadnej zewnętrznej biblioteki (już budować inne instrumenty klawiszowe)
  2. klawiatura będzie używać Qt GUI (tradycyjny)

Odpowiedz

0

I zajęło mi sporo czasu, aby dowiedzieć się, jak to zrobić w QT5 bez qml i zbyt dużo pracy. Więc pomyślałem, że podzielę:

#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); 
} 

Kluczem tutaj jest to, że klikając przyciski (jeśli chcesz ręcznie wprowadzać z klawiatury), uruchamia sendevent do bieżącego obiektu thas ma ostrości (na przykład pole tekstowe). Oczywiście możesz zakodować kod hardbox, ale działa to tylko wtedy, gdy masz tylko jedno wejście, z którego możesz korzystać z klawiatury.

Ostatnią rzeczą, którą musisz upewnić się, to ustawić FocusPolicy przycisków klawiatury na NoFocus, aby zapobiec przesunięciu ostrości po naciśnięciu klawiatury.

kuponów iść do https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/

nadzieję, że to pomaga kogoś.

2

Rozumiem są dwa wyzwania:

  1. Pierwsze powiadomiony o tym, kiedy, aby pokazać/ukryć klawiaturę ekranową, na podstawie naciskiem będąc na widżetów tekstowych
  2. Jak pisać naciśnięcia klawisza zdarzenie widżetów tekstowych

odpowiedź

  1. Co do pierwszego, można użyć QObject::InstallEventFilter() dla widżetów, dla których chcesz udostępnić usługę klawiatury. Następnie możesz wyszukać kod mouseReleaseEvent wzdłuż linii kodu Qt w łączu.
  2. Można to osiągnąć stosując QCoreApplication::postEvent()

Co do QPlatformInputContext, uzyskać przykład Qt Virtual Keyboard tutaj.

+1

Do automatycznego ukrywania użyłem sygnału QChanged (QWidget * stary, QWidget * nowy) z QApplication.do umieszczenia tekstu w QLineEdit/QTextEdit, wysłałem kluczowe zdarzenie w gnieździe, które jest połączone z przyciskiem kliknięcia przycisku klawiatury. Więc nie ma potrzeby, aby napisać dodatkowe dla tekstu wejściowego.To działa dobrze i jest również ogólna. – Jai

0

Właśnie to działało w mojej wspaniałej aplikacji Qt. Oto jak to zrobiłem.

dla Androida i iOS:

QObject::connect(lineEdit, SIGNAL(returnPressed()), qApp->inputMethod(), SLOT(hide())); 

na iOS:

Podklasa QLineEdit i dodać następujące:

void focusOutEvent(QFocusEvent * fe) 
{ 
    QLineEdit::focusOutEvent(fe); 
#ifdef Q_OS_IOS 
    if(fe->reason() == Qt::OtherFocusReason) 
    { 
     // Done was pressed! 
     emit returnPressed(); 
    } 
#endif 
} 

Btw, docs QInputMethod nie mówią wiele o tym, jak dostęp do niego z C++. Musisz pobrać instancję z QGuiApplication, tak jak to zrobiłem powyżej.

Nadzieję, że pomaga.

1

Qt zapewnia teraz strukturę wirtualnej klawiatury w Qt 5.5.

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

nie próbowałem, więc nie mogę powiedzieć, jak łatwo jest używać. Wygląda na to, że jest oparty na QML.

(ona mówi, że to dla Linuksa i boot2qt, ale może być także zbudowany dla systemu Windows według strony budynku (http://doc.qt.io/QtVirtualKeyboard/build.html))

+2

Należy zauważyć, że QtVirtualKeyboard jest licencjonowany komercyjnie lub przez GPL, inny niż reszta Qt, co może uniemożliwić użytkownikom korzystanie z niego. – FourtyTwo