커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
816
1,282
3,878
3,988,719
  현재접속자 : 94 (회원 0)






배너 신청 문의

 
작성일 : 17-11-06 13:46
[QT/Embedded] 라즈베리파이 내 키보드 동작 관련
 글쓴이 : 김촙촙
조회 : 1,755   추천 : 0  
라즈베리파이에 가스센서 감지 임베디드 시스템을 구축하고있습니다.

PyQt 기반 GUI를 구현하여 라즈베리파이에서 실행시킨 뒤,

usb 무선 키보드 마우스를 사용하니 둘다 먹통이네요 ...

찾아보니 오토마타 기반으로 가상키보드를 직접 구현해서 사용해야된다는데

파이썬을 이용해서 위젯형식으로 구현할수있는 방법이 없을까요 ?

구글링을 해보니 PyQt4기반 소스코드는 나오는데 PyQt5라서 에러가 너무 발생하네요.

from PyQt4 import QtGui, QtCore
from decimal import Decimal

  1. applicationle widgets
SIP_WIDGETS = [QtGui.QLineEdit]

class MyFlatPushButton(QtGui.QPushButton):
    def __init__(self, caption, min_size=(50, 50)):
        self.MIN_SIZE = min_size
        QtGui.QPushButton.__init__(self, caption)
        self.setFocusPolicy(QtCore.Qt.NoFocus)

    def sizeHint(self):
        return QtCore.QSize(self.MIN_SIZE[0], self.MIN_SIZE[1])


class SoftInputWidget(QtGui.QDialog):
    def __init__(self, parent_object, keyboard_type='default'):
        QtGui.QDialog.__init__(self)
        self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint)
        self.INPUT_WIDGET = None
        self.PARENT_OBJECT = parent_object
        self.signalMapper = QtCore.QSignalMapper(self)

        self.NO_ORD_KEY_LIST = list()
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Left)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Up)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Right)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Down)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Backspace)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Enter)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Tab)
        self.NO_ORD_KEY_LIST.append(QtCore.Qt.Key_Escape)

        self.do_layout(keyboard_type)

        self.signalMapper.mapped[int].connect(self.buttonClicked)

    def do_layout(self, keyboard_type='default'):
        """
        @param   keyboard_type:
        @return:
        """
        gl = QtGui.QVBoxLayout()
        self.setFont(self.PARENT_OBJECT.font())
        number_widget_list = []
        sym_list = range(0, 10)
        for sym in sym_list:
            button = MyFlatPushButton(str(sym))
            button.KEY_CHAR = ord(str(sym))
            number_widget_list.append(button)

        button = MyFlatPushButton('*')
        button.KEY_CHAR = ord('*')
        number_widget_list.append(button)

        # alphabets
        alpha_widget_list = []
        sym_list    = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
                       'new_row',
                       'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
                       'new_row',
                       'z', 'x', 'c', 'v', 'b', 'n', 'm']
        for sym in sym_list:
            if sym == 'new_row':
                alpha_widget_list.append('new_row')
            else:
                button = MyFlatPushButton(sym)
                button.KEY_CHAR = ord(sym)
                alpha_widget_list.append(button)

        # back space
        control_widget_list = []
        button = MyFlatPushButton('<B')
        button.setToolTip('Backspace')
        button.KEY_CHAR = QtCore.Qt.Key_Backspace
        control_widget_list.append(button)
        control_widget_list.append('sep')

        # tab
        button = MyFlatPushButton('>T')
        button.KEY_CHAR = QtCore.Qt.Key_Tab
        control_widget_list.append(button)
        control_widget_list.append('sep')

        # space
        button = MyFlatPushButton('SPC')
        button.KEY_CHAR = QtCore.Qt.Key_Space
        control_widget_list.append(button)
        control_widget_list.append('sep')

        # close
        button = MyFlatPushButton('X')
        button.KEY_CHAR = QtCore.Qt.Key_Escape
        control_widget_list.append(button)
        control_widget_list.append('sep')

        # enter
        button = MyFlatPushButton('ENT', min_size=(110, 60))
        button.KEY_CHAR = QtCore.Qt.Key_Enter
        control_widget_list.append(button)
        control_widget_list.append('sep')

        alist = list()
        alist.append((QtCore.Qt.Key_Left,  'L-A'))
        alist.append((QtCore.Qt.Key_Right, 'R-A'))
        alist.append((QtCore.Qt.Key_Up,    'U-A'))
        alist.append((QtCore.Qt.Key_Down,  'D-A'))
        for key in alist:
            button = MyFlatPushButton(key[1])
            button.KEY_CHAR = key[0]
            control_widget_list.append(button)

        MAX_COL = 10
        col     = 0
        tlist   = list()
        if keyboard_type == 'numeric':
            widget_list = number_widget_list
        elif keyboard_type == 'alpha':
            widget_list = alpha_widget_list
        else:
            widget_list = list()
            widget_list.extend(number_widget_list)
            widget_list.append('new_row')
            widget_list.extend(alpha_widget_list)

        widget_list.append('new_row')
        widget_list.extend(control_widget_list)

        for widget in widget_list:
            if widget == 'new_row':
                col = MAX_COL
            elif widget == 'sep':
                tlist.append(self.get_vline())
                continue
            else:
                tlist.append(widget)
                widget.clicked.connect(self.signalMapper.map)
                self.signalMapper.setMapping(widget, widget.KEY_CHAR)

            if col == MAX_COL:
                col = 0
                v = QtGui.QHBoxLayout()
                v.addStretch()
                v.setSpacing(5)
                map(v.addWidget, tlist)
                v.addStretch()
                gl.addLayout(v)
                tlist = []
            else:
                col += 1

        v = QtGui.QHBoxLayout()
        v.setSpacing(5)
        v.addStretch()
        map(v.addWidget, tlist)
        v.addStretch()
        gl.addLayout(v)
        gl.setContentsMargins(0, 0, 0, 0)
        gl.setSpacing(5)
        gl.setSizeConstraint(gl.SetFixedSize)

        self.setLayout(gl)

    def reject(self):
        self.buttonClicked(QtCore.Qt.Key_Escape)

    def buttonClicked(self, char_ord):
        w = self.INPUT_WIDGET
        if char_ord in self.NO_ORD_KEY_LIST:
            keyPress = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, char_ord, QtCore.Qt.NoModifier, '')
        else:
            keyPress = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, char_ord, QtCore.Qt.NoModifier, chr(char_ord))

        # send keypress event to widget
        QtGui.QApplication.sendEvent(w, keyPress)

        # line edit returnPressed event is triggering twise for press and release both
        # that is why do not send release event for special key
        if char_ord not in self.NO_ORD_KEY_LIST:
            keyRelease = QtGui.QKeyEvent(QtCore.QEvent.KeyPress, char_ord, QtCore.Qt.NoModifier, '')
            QtGui.QApplication.sendEvent(w, keyRelease)

        # hide on enter or esc button click
        if char_ord in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Escape):
            self.hide()

    def show_input_panel(self, widget):
        self.INPUT_WIDGET = widget
        self.show()
        self.update_panel_position()

    def update_panel_position(self):
        widget = self.INPUT_WIDGET
        if not widget: return

        widget_rect         = widget.rect()
        widget_bottom       = widget.mapToGlobal(QtCore.QPoint(widget.frameGeometry().x(), widget.frameGeometry().y())).y()
        screen_height       = QtGui.qApp.desktop().availableGeometry().height()
        input_panel_height  = self.geometry().height() + 5

        if (screen_height - widget_bottom) > input_panel_height:
            # display input panel at bottom of widget
            panelPos = QtCore.QPoint(widget_rect.left(), widget_rect.bottom() + 2)
        else:
            # display input panel at top of widget
            panelPos = QtCore.QPoint(widget_rect.left(), widget_rect.top() - input_panel_height)

        panelPos = widget.mapToGlobal(panelPos)
        self.move(panelPos)

    def _get_line(self, vertical=True):
        line = QtGui.QFrame()
        line.setContentsMargins(0, 0, 0, 0)
        if vertical is True:
            line.setFrameShape(line.VLine)
        else:
            line.setFrameShape(line.HLine)
        line.setFrameShadow(line.Sunken)
        return line

    def get_hline(self):
        return self._get_line(vertical=False)

    def get_vline(self):
        return self._get_line()


class TouchInterface(QtCore.QObject):
    def __init__(self, PARENT_WIDGET):
        QtCore.QObject.__init__(self)
        self._PARENT_WIDGET        = PARENT_WIDGET
        self._input_panel_all      = SoftInputWidget(PARENT_WIDGET, 'default')
        self._input_panel_numeric  = SoftInputWidget(PARENT_WIDGET, 'numeric')

    def childEvent(self, event):
        if event.type() == QtCore.QEvent.ChildAdded:
            if isinstance(event.child(), *SIP_WIDGETS):
                event.child().installEventFilter(self)

    def eventFilter(self, widget, event):
        if self._PARENT_WIDGET.focusWidget() == widget and event.type() == QtCore.QEvent.MouseButtonPress:
            if hasattr(widget, 'keyboard_type'):
                if widget.keyboard_type == 'default':
                    self._input_panel_all.show_input_panel(widget)
                elif widget.keyboard_type == 'numeric':
                    self._input_panel_numeric.show_input_panel(widget)

        return False


class TouchInputWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.touch_interface = TouchInterface(self)

    def childEvent(self, event):
        self.touch_interface.childEvent(event)

    def eventFilter(self, widget, event):
        return self.touch_interface.eventFilter(widget, event)


class ExampleWidget(TouchInputWidget):
    def __init__(self):
        TouchInputWidget.__init__(self)

        self.txtNumeric    = QtGui.QLineEdit()
        # actiate touch input
        self.txtNumeric.keyboard_type = 'numeric'

        self.txtText = QtGui.QLineEdit()
        # activate touch input
        self.txtText.keyboard_type = 'default'

        gl = QtGui.QVBoxLayout()
        gl.addWidget(self.txtNumeric)
        gl.addWidget(self.txtText)

        self.setWindowTitle('Touch Input Demo')
        self.setLayout(gl)

if __name__ == '__main__':
    app = QtGui.QApplication([])
    ExampleWidget().show()
    app.exec_()

파이썬 고수분들의 조언 부탁드립니다.
.



devopia 17-11-08 16:16
 
근본 문제는 무선 장치가 해당 디바이스에서 아무 문제없이 사용되도록 하는 것 아닐까요?
가상 키보드는 Qt에서 지원하기 보다는 해당 OS에서 지원하는 것을 찾아 보시길...
만약 Qt에서 해답을 찾고자 한다면 Qt에서 제공하는 가상 키보드를 이용하면 될 것 같네요. 단 QML 버전입니다.
위젯에서 사용하려면 QQuickWidget을 이용하는 방법이 있습니다.
     
김촙촙 17-11-13 15:10
 
감사합니다 하드웨어부분부터 접근하니 해결되네요 .
 
 

Total 7,020
번호 제   목 글쓴이 날짜 조회 추천
7020 [QT/X11] Qt 5.6에서 잘 실행 되던게 Qt 5.11로 올렸더니 … devilqoo 11-16 31 0
7019 [QT/Win32] qt 객체 공유 방법 질문합니다! (2) wjdtnwjdtn 11-14 64 0
7018 [QT/Win32] android 개발할때 언어 자바사용하나요? (1) 가나1 11-07 111 0
7017 [QT/Embedded] PYQT Raspberry pi 에서 이와 같은 디자인을 하려… 쿠쿠다… 11-01 124 0
7016 [QT/Win32] QML에서 텍스트가 너무 흐리게 표시되네요 (1) 민토고 10-25 267 0
7015 [QT/Embedded] binary file 수정하는 프로그램 작성 binary file수… (1) 정말모… 10-12 235 0
7014 [QT/Embedded] Qt 라이센스에 관련하여 문의드립니다. (3) 둣바이… 10-10 353 0
7013 [QT/X11] Qt 프로그램 초기 시작 위치를 설정할 수 있나… (3) 둣바이… 10-04 324 0
7012 [QT/Embedded] setStyleSheet CPU 점유율 누적 문제 (1) 뮤즈 09-17 455 0
7011 [QT/Embedded] Qt ui가 변경이 안됩니다. (1) rufks0435 09-14 467 0
7010 [QT/Win32] Qdialog show문제 (1) 삼패르 09-13 373 0
7009 [QT/Win32] QT 컴파일러 질문입니다. RoolRooRal 09-10 412 0
7008 [QT/Win32] Qdialog 프로세스 실행 중 화면에 UI 표시하고 … pyhef2 09-04 418 0
7007 [QT/Embedded] QTextEdit 을 이용한 setText 시, CPU 사용률 증가 … 둣바이… 09-03 481 0
7006 [QT/Win32] Qt로 히스토그램(도수분포형) 그래프를 그려… 2tachi 09-02 392 0
7005 [QT/Win32] qml 관련하여 질문드립니다. 배우러… 08-24 398 0
7004 [QT/Win32] Qwidget에 Qlabel을 추가하여 오버랩시켜 webcam을 … qweret123 08-23 430 0
7003 [QT/X11] 영상이 main 루프에서는 나오는데 thread 에서는… (1) 깨굴 08-17 525 0
7002 [QT/Embedded] QML 에서 shader effect 를 사용할 때... devilqoo 08-10 443 0
7001    [QT/Embedded] QML 에서 shader effect 를 사용할 때... devilqoo 08-24 419 0
7000 [QT/Win32] QT jpg파일을 움직이게 애니메이션효과를 주고… (1) 우준 07-26 722 0
6999 [QT/Embedded] [QT/QML]Image (png파일) 로드하기전 사이즈 체크… (1) 벨제붑 07-20 729 0
6998 [QT/Win32] qt html5 다국어 지원 오닝그 07-10 773 0
6997 [QT/X11] Qprocess로 스트림영상을 QFrame(혹은 다른)에 보… (4) 깨굴 07-05 952 0
6996 [QT/Embedded] 한글 깨져서 문의 드립니다. (11) 트링 07-04 1205 0
6995 [QT/Win32] error: 'qtConfig' is not a recognized test functio… (6) cbt0949 06-28 1043 0
6994 [QT/Embedded] QPushButton 기본 상태 주기 (1) NaturalSof… 06-27 723 0
6993 [QT/X11] library 합치기? 깨굴 06-27 625 0
6992 [QT/Embedded] 한글 출력에 대해 질문 드립니다. (1) 트링 06-27 797 0
6991 [QT/Win32] eventFilter 함수 내에서 treeView내의 index 얻는 문… (9) cbt0949 06-26 790 0
 1  2  3  4  5  6  7  8  9  10    


About korone.net | Copyright 2003 korone.net. All rights reserved.