조회 수 235124 추천 수 0 댓글 32
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

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"));

    ...
}

 

셸에서 환경변수를 설정한다.

$ QT_IM_MODULE=qtvirtualkeyboard myapp

 

데스크탑의 경우 더 이상 할게 없지만 아닌 경우는 응용프로그램의 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를 사용한 화면.

qtvirtualkeyboard.png

 

  • ?
    몽키찡 2019.06.17 13:27

    안녕하세요.

     

    라즈베리파이3- 라즈비안에서 QT로 프로그램을 개발중입니다.

     

    가상키보드를 띄우고 싶은데... QT C++로 구성되있는 GUI프로그램에서 QML InputPanel을 어떻게 띄울수있는지 궁금합니다... 혹시 소스예제라도 있으면 부탁드려요 ㅠㅠㅠ 

  • ?
    makersweb 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

  • ?

    아무래도 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등)등으로 개발해도 해당 위젯을 클릭하면 최상위 창으로 나올겁니다.

    qtvirtualkeyboard_raspberrypi3.png

  • ?
    몽키찡 2019.06.19 11:23

    마지막으로 하나만 더 여쭤봐도 될가요...

    일단 가상키보드는 문제없이 잘뜹니다!!!

     

    1. 하지만 문제는 기존 MainWindow위에 가상키보드가 검정색 배경으로 다가려서 글씨입력하는 상황을 볼수없습니다..

    키보드는 하단에 위치하지만 상단이 모두 검정색 배경으로 변해버립니다 ㅠㅠ

     

    2. 가상키보드에서 src/config/config.pri 파일에 CONFIG += lang-en_GB lang-ko_KR 추가하여 한글/영어 둘다 쓸수있도록 하였는데 문제는 한글입력시 eg.ㅎㅏㄴㄱㅡㄹ 이런식으로 다 띄어쓰기되어 표시되어버립니다...

     

  • ?
    makersweb 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 Files첨부 (2)

    캡처.JPG

     

    캡처.JPG

     


    pyqt5로 제작된 파이썬 프로그램입니다. 여기서 텍스트박스(n번 장비)를 선택하면 터치스크린에 가상키보드가 올라오긴합니다,, 그런데 아래와 같이 

    이렇게 동작됩니다 ㅠㅠ,, 라즈베리파이4를 사용중이구요 !! 혹시 해결가능 할까요?!

  • ?
    makersweb 2021.08.09 18:48

    글쎄요ㅠ 이미지만 봐서는 예측하기가 어렵네요! 혹시 에러 메세지를 출력하지는지요.?

  • ?
    banbol 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파일을 어떻게 수정해야 하는지 해당 부분에 대해서 조금 더 설명해주실 수 있으신지요?

     

     

     

     

  • ?
    makersweb 2019.07.26 11:24

    QT_IM_MODULE 설정하시고, 키보드를 사용하고자하는 QML에서 InputPanel을 사용하면됩니다. main qml에 배치한 이유는 키보드 인스턴스를 하나만 생성하고 글로벌로 동작시키기 위함입니다~

  • ?
    민토고 2019.08.22 09:22

    Qt virtualkeyboard는 GPL / 상용 라이센스 아닌가요?

  • ?
    makersweb 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.

  • ?
    makersweb 2019.09.05 18:17

    제가 잘못 알고 있었던 거 같습니다. GPL라이센스가 맞습니다. 댓글 감사합니다~

  • ?
    ㅎㅇㅎㅇ 2019.11.06 21:56

    안녕하세요 !! 위에 라즈베리파이에 설치하는 코드 따라서 설치해봤는데 아무리 해도 실행이 안되더라구요.. 어떻게 실행시키는지 알려주실 수 있으실까요 ㅠㅠ

  • ?
    makersweb 2019.11.08 13:05

    직접 컴파일 또는 apt로 설치를 시도하셨나요? 라즈베리파이 및 운영체제 버전은 어껀 것을 사용하시는지요?

  • ?
    ㅎㅇㅎㅇ 2019.11.08 20:15
    직접 컴파일로 시도를 했습니다 ! qt프로그램 깔고 소스코드 컴파일 후 디렉토리 복사까지 완료한 상태이고 라즈베리파이B와 라즈비안 10버전을 이용중입니다
  • ?
    makersweb 2019.11.10 18:38

    직접 컴파일 하신거라면 Qt버전등을 체크해보셔야합니다. 라즈비안의 최신버전(Buster)을 사용하신다면 sudo apt install -y qtvirtualkeyboard-plugin 명령으로 설치하는 걸 추천드립니다.

  • ?

    안녕하세요, 해당 부분을 구현하고 응용하던 중 궁금한 부분 내용이 있어 문의 드립니다.

     

    keyboard 입력 Component를 다음과 같이 만들었습니다.

     

    makersweb.png

     

    제가 구현하고 싶은 내용은 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 문서에서는 답을 찾을 수 없어서 질문드립니다.]

  • ?
    makersweb 2021.02.02 21:47

    타이밍과 관련된 문제일 수 있다는 생각이 드네요. 대신 다음과 같은 트릭을 쓰는 방법이 있습니다.

     

    ...
            TextField{
                id: textField
                width: 250
                height: 70
                anchors.top: parent.top
                anchors.topMargin: 30
                anchors.horizontalCenter: parent.horizontalCenter
            }
     
     
            Component.onCompleted: timer.start()
     
     
            Timer {
                id: timer
                interval: 500
                onTriggered: textField.forceActiveFocus()
            }
    ...

     

    그리고 TextField 의 activeFocusOnPress 프로퍼티를 false 로 설정하면 TextField를 클릭해도 키보드 활성화는 막을 수 있습니다.

  • ?

    감사합니다.

    답변 주신 방법들이 모두 동작하는 것을 확인했습니다.

    좋은 하루 되세요!

     

    [P.s 확인 후 몇 번 더 동작해본 결과, 가끔 아래와 같이 Shift 키가 활성화되지 않는 경우가 발생하였습니다. 이 경우, TextField를 Click 하면 Shift키가 활성화되었습니다. interval을 1000으로 늘릴 경우 발생하지 않는 것 처럼 보였습니다. 참고가 될 까 싶어 첨부드립니다.]

    makersweb2.png

     

    makersweb3.png

     

  • ?

    1. 안녕하세요 키보드 나타나는것까지는 잘 되었는데 언어 선택에 다른 한국어/영어를 제외한 나머지 언어들을 빼고 싶습니다. 방법이 있나요?

    화면 캡처 2021-02-09 154228.png

     

    2. LineEdit 가 화면 하단에 위치할 경우 Virtual Keyboard를 통해 입력 중인 내용을 표시 할 수 있는 방법이 없을 까요?

  • ?
    makersweb 2021.02.09 21:01

    1. 다음과 같이 locale을 설정하면 됩니다.

     

    import QtQuick.VirtualKeyboard.Settings 2.1
     
    ...
     
        Component.onCompleted: {
            var activeLang = [ "ko_KR", "en_GB" ]
     
            VirtualKeyboardSettings.activeLocales = activeLang
            VirtualKeyboardSettings.locale = activeLang[0] //default
        }
     
        InputPanel {
            id: inputPanel
     
            ...
        }
    ...

     

    2. 입력모드(키보드가 활성화)에 따라 LineEdit의 위치(y)를 변경하면됩니다. (스마트폰처럼요)

  • ?

    너무너무 감사합니다..ㅜ.ㅜ

    몇가지만 더 여쭤보고 싶은게 있어요.

     

    1. C++로 Main Windows를 만들었는데 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 한줄만 추가하면 가상 키보드가 나오는데 이 때 QML을 사용하여 가상 키보드를 표시 하지 않고 locale을 설정 할 수 있는 방법은 없을까요?

     

    2. 아래와 같이 qtvirtualkeyboard를 qml로 작성한 뒤 main 에서 MainWindow와 qml을 같이 실행 되게 하였습니다.

    이 때 MainWindow에 있는 LineEdit를 선택 후 키보드 클릭 시 Focus를 잃으며 입력이 되지 않는데 이를 어떻게 해결 해야할까요?

    화면 캡처 2021-02-10 031544.png

     

    3. qtvirtualkeyboard대신 Windows에서 재공하는 osk.exe를 사용해볼까 했는데 QProcess로 해당 실행 파일을 실행 시 실osk.exe파일이 실행되지 않는데 이유가 뭘까요? 

  • ?
    makersweb 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파일들을 복사하여 실행 파일이 있는 경로에 붙여넣었는데 여전히 가상 키보드가 나타나질 않습니다.

    이럴경우 어떻게 해결해야 하나요?

     

  • ?
    makersweb 2021.03.19 23:04

    Qt는 일반적으로 QTDIR/plugins 에서 디렉토리를 찾습니다. (QTDIR 은 Qt가 설치된 디렉토리) qt.conf 파일에 하드코딩 된 Qt 라이브러리 경로를 재정의 할 수 있습니다. 다른 방법은 응용 프로그램을 실행하기 전에 QT_PLUGIN_PATH 환경 변수를 설정하는 것입니다.

  • ?
    누눙 2021.08.13 13:29

    작성자님, 질문이 있습니다! 가상키보드가 올라오면 입력창을 살짝 가리는데 이것을 카톡처럼 내용이 위로 올라가게끔 할 수 있을까요?!

  • ?
    makersweb 2021.08.17 12:49

    가상 키보드가 활성화 될때 TextField 의 y좌표를 조정(-)하여 위치를 이동하시면 됩니다.

  • ?
    QT러닝 2022.02.17 08:52

    질문있습니다. 라즈베리4 라즈비안 버스터에서 개발하고 있습니다.

    저는 qml을 사용하지 않고 qwidget을 사용하고 있습니다.  

    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 선언했으나 lineedit을 클릭하면 키보드가 나오지 않습니다.

    qt에서 제공하는 예제중 basic이라는 예제를 돌려보면 가상키보드가 잘 동작합니다.

    qwidget에서 가상 키보드를 사용하는 방법이 있을까요? 


  1. No Image notice

    Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서

    Date2019.01.05 CategoryQML and Qt Quick By운영자 Views110094
    read more
  2. 가상키보드(Qt Virtual Keyboard)를 사용하는 방법

    Date2019.05.03 CategoryMobile and Embedded Bymakersweb Views235124
    Read More
  3. Windows에서 Qt D-Bus를 사용하여 프로세스간 통신(IPC)

    Date2019.05.02 CategoryGeneral and Desktop Bymakersweb Views7350
    Read More
  4. No Image

    QML과 QtQuick 모듈 개념과 기본 타입들

    Date2019.04.26 CategoryQML and Qt Quick Bymakersweb Views15511
    Read More
  5. QML 전역 객체 (Global Object)

    Date2019.04.10 CategoryQML and Qt Quick Bymakersweb Views2701
    Read More
  6. tslib의 ts_calibrate를 응용해서 Qt로 터치보정기능 구현

    Date2019.04.06 CategoryQML and Qt Quick Bymakersweb Views3122
    Read More
  7. No Image

    GPU가 없는 장치에서 Qt Quick을 사용

    Date2019.04.02 CategoryQML and Qt Quick Bymakersweb Views4277
    Read More
  8. No Image

    QTextCodec클래스를 사용하여 유니코드와 EUC-KR 변환

    Date2019.03.25 CategoryGeneral and Desktop Bymakersweb Views5962
    Read More
  9. No Image

    qInstallMessageHandler를 이용한 디버그 메세지 출력 제어하기

    Date2019.02.25 CategoryGeneral and Desktop Bymakersweb Views3637
    Read More
  10. Qt5기반 독립 프로세스(out-of-process)로 동작하는 가상키보드(virtual keyboard)

    Date2019.02.24 CategoryMobile and Embedded Bymakersweb Views5119
    Read More
  11. Qml 기본 컴포넌트 강좌 (4) - 모델 리스팅(Listing)

    Date2019.02.23 CategoryQML and Qt Quick By운영자 Views7417
    Read More
  12. Qt Bluetooth를 이용한 시리얼(Serial) 통신

    Date2019.02.17 CategoryMobile and Embedded Bymakersweb Views6304
    Read More
  13. Qml 기본 컴포넌트 강좌 (3) - 배치(positioning) 컴포넌트

    Date2019.02.10 CategoryQML and Qt Quick By운영자 Views7731
    Read More
  14. No Image

    QString 문자열 다루기 예제

    Date2019.01.26 CategoryGeneral and Desktop By운영자 Views47043
    Read More
  15. Qt SQL을 이용한 가벼운 데이터베이스 다루기

    Date2019.01.23 CategoryGeneral and Desktop By운영자 Views9514
    Read More
  16. 구글 클라우드 Speech-To-Text API를 Qt기반(C++, Qml)테스트

    Date2019.01.20 CategoryGeneral and Desktop Bymakersweb Views5167
    Read More
  17. No Image

    QNetworkAccessManager를 통해 HTTP POST 하는 예제

    Date2019.01.17 CategoryGeneral and Desktop Bymakersweb Views7112
    Read More
  18. Qt응용프로그램 실행 시 콘솔창(터미널)같이 띄우기

    Date2019.01.16 CategoryGeneral and Desktop Bymakersweb Views7219
    Read More
  19. 안드로이드 가상장치 사용

    Date2019.01.13 CategoryMobile and Embedded Bymakersweb Views3350
    Read More
  20. No Image

    Qml 기본 컴포넌트 강좌 (2)

    Date2019.01.05 CategoryQML and Qt Quick Bymakersweb Views10956
    Read More
  21. Qml 기본 컴포넌트 강좌 (1)

    Date2019.01.03 CategoryQML and Qt Quick Bymakersweb Views15235
    Read More
Board Pagination Prev 1 5 6 7 8 9 Next
/ 9