Qt5에서 제공하는 가상키보드(Qt Virtual Keyboard)를 사용하는 방법에 대해서 설명한다. 다만 Qt Wayland환경에서 사용하는 방법은 설명하지 않으므로 자세한 내용은 다음글을 참고하면 된다. https://doc.qt.io/qt-5/qtvirtualkeyboard-deployment-guide.html
가상키보드가 화면에 보여지기 위한 벙법에는 두가지가 있다.
데스크탑(Windows 또는 Linux/X11 환경) : 이 경우 응용프로그램을 수정 할 필요가 없이 키보드는 자체적인 최상위 창으로 보여지게된다.
임베디드 장치(특히 eglfs 같은 환경) : 이 경우 응용프로그램의 QML에 InputPanel 을 배치함으로써 화면에 보여진다. 멀티 윈도우를 지원하지 않는 (윈도우 시스템이 없는)환경에서는 필수이고 데스크탑 환경에서는 선택적으로 사용할 수 있다.
사용 방법은 플러그인 프로젝트 파일에서 자동으로 선택된다. (컴파일 시점에)
두 가지 방법 모두에서 응용 프로그램은 QT_IM_MODULE 환경 변수를 설정하여 플러그인을로드해야한다.
응용프로그램의 main함수에서 설정하거나
int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
...
}
셸에서 환경변수를 설정한다.
데스크탑의 경우 더 이상 할게 없지만 아닌 경우는 응용프로그램의 QML에서 InputPanel을 사용하여 인스턴스화해야 한다.
import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.1
Window {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
TextField{
width: 250
height: 70
anchors.top: parent.top
anchors.topMargin: 30
anchors.horizontalCenter: parent.horizontalCenter
}
InputPanel {
id: inputPanel
z: 99
x: 0
y: window.height
width: window.width
states: State {
name: "visible"
when: inputPanel.active
PropertyChanges {
target: inputPanel
y: window.height - inputPanel.height
}
}
transitions: Transition {
from: ""
to: "visible"
reversible: true
ParallelAnimation {
NumberAnimation {
properties: "y"
duration: 250
easing.type: Easing.InOutQuad
}
}
}
}
}
라즈베리파이3에서 욕토(yocto)로 빌드한 임베디드 리눅스 및 eglfs 환경으로 qtvirtualkeyboard를 사용한 화면.
2019.06.17 13:27
2019.06.17 15:45
qtvirtualkeyboard 플러그인이 있나요? 먼저 플러그인 라이브러리가 있는지 보시고 없으면
라즈비안 운영체제에서는 아래 명령으로 간단하게 설치가능합니다.
sudo apt update -y
sudo apt install -y qtvirtualkeyboard-plugin
그리고 x11 환경에서는 아래 코드만 main 함수에 넣어주면 되요!
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
2019.06.18 09:49
sudo apt update -y는 성공했습니다.
pi@raspberrypi:~ $ sudo apt install -y qtvirtualkeyboard-plugin
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
E: qtvirtualkeyboard-plugin 패키지를 찾을 수 없습니다
2019.06.18 09:59
개발환경
pi@raspberrypi:~ $ qmake -version
QMake version 3.0
Using Qt version 5.3.2 in /usr/lib/arm-linux-gnueabihf
2019.06.19 00:52
아무래도 apt로 설치하는 건 우분투 18.04 에서 유효한듯하네요..
라즈베리파이에서 qt가상키보드를 직접 컴파일을 하시면 될 듯합니다.
저의 경우 라즈비안 처음 설치 후 아래순서로 진행 했습니다. (apt install 하면 Qt5.7로 설치되네여.)
// 의존성 패키지 설치
sudo apt install cmake build-essential git
sudo apt install qt5-default qtbase5-dev qt5-qmake libqt5gui5 qtscript5-dev qtquickcontrols2-5-dev libqt5network5 qtdeclarative5-dev
sudo apt install qml-module-qtquick*
sudo apt install qml-module-qt-labs-folderlistmodel
sudo apt-get install libqt5svg5-dev
sudo apt install qtbase5-private-dev
// qtvirtualkeyboard 소스코드 컴파일
pi@raspberrypi:~ $ git clone git://code.qt.io/qt/qtvirtualkeyboard.git
pi@raspberrypi:~ $ cd qtvirtualkeyboard/
pi@raspberrypi:~/qtvirtualkeyboard $ git checkout 5.7
pi@raspberrypi:~/qtvirtualkeyboard $ qmake
pi@raspberrypi:~/qtvirtualkeyboard $ make
// 컴파일 후 qml 및 플러그인 디렉토리 복사
pi@raspberrypi:~/qtvirtualkeyboard/qml $ sudo cp -r QtQuick/ /usr/lib/arm-linux-gnueabihf/qt5/qml/
pi@raspberrypi:~/qtvirtualkeyboard/plugins $ sudo cp -r platforminputcontexts/ /usr/lib/arm-linux-gnueabihf/qt5/plugins/
초간단 qml로 만든 후 실행해보면 아래 처럼 나옵니다. C++ 위젯(예: QLineEdit등)등으로 개발해도 해당 위젯을 클릭하면 최상위 창으로 나올겁니다.
2019.06.19 11:23
마지막으로 하나만 더 여쭤봐도 될가요...
일단 가상키보드는 문제없이 잘뜹니다!!!
1. 하지만 문제는 기존 MainWindow위에 가상키보드가 검정색 배경으로 다가려서 글씨입력하는 상황을 볼수없습니다..
키보드는 하단에 위치하지만 상단이 모두 검정색 배경으로 변해버립니다 ㅠㅠ
2. 가상키보드에서 src/config/config.pri 파일에 CONFIG += lang-en_GB lang-ko_KR 추가하여 한글/영어 둘다 쓸수있도록 하였는데 문제는 한글입력시 eg.ㅎㅏㄴㄱㅡㄹ 이런식으로 다 띄어쓰기되어 표시되어버립니다...
2019.06.19 13:59
배경이 검정색으로 나오는 경우 xcb관련 라이브러리 있는지 보시고 아래 처럼 실행해보세요.
$ QT_XCB_GL_INTEGRATION=xcb_egl ./myapp
2021.08.09 13:16
안녕하세요 !! 여기 작성해주신 글을 보고 많은 도움이 되었습니다 !! C++ 을 하나도 몰라도 따라만 하니 동작이 잘되네요!!
한가지 여쭤보고 싶은것은 혹시 요기서 말씀하신 myapp이 어떤것인가요?! 컴파일후 나오는 실행파일인가요?!
저도 윗분과 같은 검정색화면 문제로 해결하고싶어 댓글남깁니다 ㅠ,ㅠ,, 미리 감사합니다.
2021.08.09 13:19
pyqt5로 제작된 파이썬 프로그램입니다. 여기서 텍스트박스(n번 장비)를 선택하면 터치스크린에 가상키보드가 올라오긴합니다,, 그런데 아래와 같이
이렇게 동작됩니다 ㅠㅠ,, 라즈베리파이4를 사용중이구요 !! 혹시 해결가능 할까요?!
2021.08.09 18:48
글쎄요ㅠ 이미지만 봐서는 예측하기가 어렵네요! 혹시 에러 메세지를 출력하지는지요.?
2019.07.26 06:19
안녕하세요. 질문이 있습니다.
현재 eglfs 응용 프로그램을 작성하는 중입니다.
여기에 qml virtual keyboard를 넣고 싶은데..
위에 설명해주신 예제에 나와있는
Window {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
이것같은 경우는 현재 제 MainWindow가 되야 하는건가요?
혹시 mainwindow가 따로 있는 상황에서 가상 키보드를 추가하려면
qml파일을 어떻게 수정해야 하는지 해당 부분에 대해서 조금 더 설명해주실 수 있으신지요?
2019.07.26 11:24
QT_IM_MODULE 설정하시고, 키보드를 사용하고자하는 QML에서 InputPanel을 사용하면됩니다. main qml에 배치한 이유는 키보드 인스턴스를 하나만 생성하고 글로벌로 동작시키기 위함입니다~
2019.08.22 09:22
Qt virtualkeyboard는 GPL / 상용 라이센스 아닌가요?
2019.08.22 15:24
Qt5.7부터 Qt Virtual Keyboard를 LGPL3로 사용가능합니다.
2019.09.05 11:13
https://doc.qt.io/qt-5/qtvirtualkeyboard-index.html
Qt5 의 virtual keyboard 모듈 설명 페이지의 라이센스부분을 보면
commercial / GNU gpl v3 이라고 명시 되어 있습니다.
LGPL이 아닌듯 한데요..
Qt Virtual Keyboard is available under commercial licenses from The Qt Company. In addition, it is available under the GNU General Public License, version 3. See Qt Licensing for further details.
2019.09.05 18:17
제가 잘못 알고 있었던 거 같습니다. GPL라이센스가 맞습니다. 댓글 감사합니다~
2019.11.06 21:56
안녕하세요 !! 위에 라즈베리파이에 설치하는 코드 따라서 설치해봤는데 아무리 해도 실행이 안되더라구요.. 어떻게 실행시키는지 알려주실 수 있으실까요 ㅠㅠ
2019.11.08 13:05
직접 컴파일 또는 apt로 설치를 시도하셨나요? 라즈베리파이 및 운영체제 버전은 어껀 것을 사용하시는지요?
2019.11.08 20:15
2019.11.10 18:38
직접 컴파일 하신거라면 Qt버전등을 체크해보셔야합니다. 라즈비안의 최신버전(Buster)을 사용하신다면 sudo apt install -y qtvirtualkeyboard-plugin 명령으로 설치하는 걸 추천드립니다.
2021.02.02 18:05
안녕하세요, 해당 부분을 구현하고 응용하던 중 궁금한 부분 내용이 있어 문의 드립니다.
keyboard 입력 Component를 다음과 같이 만들었습니다.
제가 구현하고 싶은 내용은 Scene이 Load되었을 때, TextField를 Click 하지 않고도 InputPanel의 가상 키보드를 Click했을 때, TextField에 입력한 글자가 작성되도록 하는 것입니다.
현재는 TextField를 Click하지 않으면 "input method is not set" 메시지가 발생합니다.
TextField에 Focus를 주기 위해 Component.onComplete 에 idInputField.forceActiveFocus, idInputPanel.forceActiveFocus 를 수행해도 Focus는 이동하지 않았습니다.
해당 부분에 대해 조언을 주실 수 있을까요?
감사합니다.
[P.s : 올려주신 글들 잘 읽고 있습니다. 대단히 큰 도움이 되고 있습니다. 진심으로 감사드립니다.]
[P.s 2 : 질문 내용과 별도로 궁금한 점이 있습니다. TextField만 있어도 Click을 할 경우 Keyboard가 제공됩니다.
그리고 TextField와 inputPanel이 한 Scene에 존재하기만 하면, 모든 TextField가 모든 InputPanel의 입력에 반응합니다.
어떻게 이런 식으로 구현되어있는지 구조를 알고 싶다면 어떤 문서를 참조하면 될까요...?
qt 홈페이지의 TextField와 InputPanel 문서에서는 답을 찾을 수 없어서 질문드립니다.]
2021.02.02 21:47
타이밍과 관련된 문제일 수 있다는 생각이 드네요. 대신 다음과 같은 트릭을 쓰는 방법이 있습니다.
그리고 TextField 의 activeFocusOnPress 프로퍼티를 false 로 설정하면 TextField를 클릭해도 키보드 활성화는 막을 수 있습니다.
2021.02.03 09:55
감사합니다.
답변 주신 방법들이 모두 동작하는 것을 확인했습니다.
좋은 하루 되세요!
[P.s 확인 후 몇 번 더 동작해본 결과, 가끔 아래와 같이 Shift 키가 활성화되지 않는 경우가 발생하였습니다. 이 경우, TextField를 Click 하면 Shift키가 활성화되었습니다. interval을 1000으로 늘릴 경우 발생하지 않는 것 처럼 보였습니다. 참고가 될 까 싶어 첨부드립니다.]
2021.02.09 15:44
1. 안녕하세요 키보드 나타나는것까지는 잘 되었는데 언어 선택에 다른 한국어/영어를 제외한 나머지 언어들을 빼고 싶습니다. 방법이 있나요?
2. LineEdit 가 화면 하단에 위치할 경우 Virtual Keyboard를 통해 입력 중인 내용을 표시 할 수 있는 방법이 없을 까요?
2021.02.09 21:01
1. 다음과 같이 locale을 설정하면 됩니다.
2. 입력모드(키보드가 활성화)에 따라 LineEdit의 위치(y)를 변경하면됩니다. (스마트폰처럼요)
2021.02.10 03:48
너무너무 감사합니다..ㅜ.ㅜ
몇가지만 더 여쭤보고 싶은게 있어요.
1. C++로 Main Windows를 만들었는데 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 한줄만 추가하면 가상 키보드가 나오는데 이 때 QML을 사용하여 가상 키보드를 표시 하지 않고 locale을 설정 할 수 있는 방법은 없을까요?
2. 아래와 같이 qtvirtualkeyboard를 qml로 작성한 뒤 main 에서 MainWindow와 qml을 같이 실행 되게 하였습니다.
이 때 MainWindow에 있는 LineEdit를 선택 후 키보드 클릭 시 Focus를 잃으며 입력이 되지 않는데 이를 어떻게 해결 해야할까요?
3. qtvirtualkeyboard대신 Windows에서 재공하는 osk.exe를 사용해볼까 했는데 QProcess로 해당 실행 파일을 실행 시 실osk.exe파일이 실행되지 않는데 이유가 뭘까요?
2021.02.10 12:04
QML 이 아닌 qtvirtualkeyboard의 설정을 위한 C++ API는 없는 것으로 알고있어요. qtvirtualkeyboard 플러그인을 직접 컴파일 해야 할겁니다.
QML 윈도우에 InputPanel 이 있을 때 클릭하게 되면 다른 윈도우는 포커스를 잃게됩니다. 따라서 멀티윈도우 응용프로그램을 개발하실거면 QML 윈도우에 InputPanel 을 생성하면 안되고 Keyboard 자체 윈도우가 생성되도록 해야합니다. 즉, QML에서 InputPanel 부분이 없어야되겠죠.
2021.03.18 17:43
지난번 댓글 도움 너무 많이 도움이 되었습니다 감사합니다.
qtvirtualkeyboard를 이용한 프로그램을 만들었는데 해당 프로그램을 배포버전으로 만들기 위해 windeploy 를 이용하여 dll들을 복사하였는데 키보드가 나타나지 않았습니다.
확인해보니 windeploy는 플러그인 모듈을 포함하지 않는다는거 같아요.
그래서 일일이 qtvirtualkeyboard 관련 dll파일들을 복사하여 실행 파일이 있는 경로에 붙여넣었는데 여전히 가상 키보드가 나타나질 않습니다.
이럴경우 어떻게 해결해야 하나요?
2021.03.19 23:04
Qt는 일반적으로 QTDIR/plugins 에서 디렉토리를 찾습니다. (QTDIR 은 Qt가 설치된 디렉토리) qt.conf 파일에 하드코딩 된 Qt 라이브러리 경로를 재정의 할 수 있습니다. 다른 방법은 응용 프로그램을 실행하기 전에 QT_PLUGIN_PATH 환경 변수를 설정하는 것입니다.
2021.08.13 13:29
작성자님, 질문이 있습니다! 가상키보드가 올라오면 입력창을 살짝 가리는데 이것을 카톡처럼 내용이 위로 올라가게끔 할 수 있을까요?!
2021.08.17 12:49
가상 키보드가 활성화 될때 TextField 의 y좌표를 조정(-)하여 위치를 이동하시면 됩니다.
2022.02.17 08:52
질문있습니다. 라즈베리4 라즈비안 버스터에서 개발하고 있습니다.
저는 qml을 사용하지 않고 qwidget을 사용하고 있습니다.
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 선언했으나 lineedit을 클릭하면 키보드가 나오지 않습니다.
qt에서 제공하는 예제중 basic이라는 예제를 돌려보면 가상키보드가 잘 동작합니다.
qwidget에서 가상 키보드를 사용하는 방법이 있을까요?
안녕하세요.
라즈베리파이3- 라즈비안에서 QT로 프로그램을 개발중입니다.
가상키보드를 띄우고 싶은데... QT C++로 구성되있는 GUI프로그램에서 QML InputPanel을 어떻게 띄울수있는지 궁금합니다... 혹시 소스예제라도 있으면 부탁드려요 ㅠㅠㅠ