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






배너 신청 문의

 
작성일 : 17-11-06 13:46
[QT/Embedded] 라즈베리파이 내 키보드 동작 관련
 글쓴이 : 김촙촙
조회 : 579   추천 : 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 6,956
번호 제   목 글쓴이 날짜 조회 추천
6956 [QT/Win32] Qt와 libvlc 이용하여 image를 받아올 수 있는지 … phgeun 02-01 141 0
6955 [QT/Win32] qt show hide시 화면 크기 변경을 하고 싶습니다. (1) 공기 01-31 149 0
6954 [QT/Win32] 메모리의 데이터를 읽고싶습니다.! (2) 불토끼 01-30 178 0
6953 [QT/Win32] project win32/unix 문의 (4) micn 01-26 194 0
6952 [QT/Win32] QT 비주얼 스튜디오 2013에서의 개발. (2) 민QT 01-24 229 0
6951 [QT/Embedded] qt cross compile 환경설정 질문이요 (1) 배고파 01-22 206 0
6950 [QT/Win32] QMainWindow 관련 질문 하아아 01-16 256 0
6949 [QT/Win32] Qt 교재 좀 추천해주세요 ckick88 12-29 519 0
6948 [QT/X11] qt firefox version (1) 큐티공… 12-19 594 0
6947 [QT/Embedded] Qt 키 이벤트 처리 시 질문입니다. 둣바이… 12-14 618 0
6946 [QT/Embedded] qt로 프로그램짜는데 궁금한 점이 있습니다. (4) 둣바이… 12-13 935 0
6945 [QT/X11] qt 배포 라이선스 문의 bash001 12-07 591 0
6944 [QT/X11] qt update() 이후 paintEvent 가 호출이 안되네요 (2) 태백 11-28 653 0
6943 [QT/Embedded] PYQT > 통신과 함께 사용할 경우 ui가 .. (2) Leni 11-27 717 0
6942 [QT/Embedded] 인터럽트 발생시 UI 업데이트를 시키는 방식 하오링… 11-22 546 0
6941 [QT/Embedded] StyleSheet 적용범위.. (2) Leni 11-22 690 0
6940 [QT/Win32] linux gif이미지 적용 (2) 큐티공… 11-16 975 0
6939 [QT/Win32] QCheckbox 체크박스 색상변경 홍사장 11-16 604 0
6938 [QT/Embedded] QCheckBox 체크 v표 크기 조정 질문입니다. (1) crootk 11-15 623 0
6937 [QT/Embedded] setStyleSheet 사용방법 질문입니다. (2) crootk 11-14 638 0
6936 [QT/Embedded] label text에 특정 문자에만 색을 바꾸고 싶습니… (1) 2tachi 11-13 559 0
6935 [QT/Win32] qpaint/ 초음파센서/ ui멈춤 (1) 핑핑이 11-09 617 0
6934 [QT/Win32] gif이미지 적용 큐티공… 11-08 556 0
6933 [QT/Win32] QT로 메모장에서 바뀌는 값을 LCD로 디스플레… 순창 11-08 535 0
6932 [QT/Embedded] Ubuntu Server에서 QT GUI 프로그램을 올릴 수 있나… (1) gpfhd 11-08 611 0
6931 [QT/Win32] qbutton 위에 qlabel (2) 큐티공… 11-07 613 0
6930 [QT/Win32] QT Widget, Qt Quick, Qt Quick Controls 2 의 관헤 궁금… (4) Fensy 11-06 682 0
6929 [QT/Embedded] 라즈베리파이 내 키보드 동작 관련 (2) 김촙촙 11-06 580 0
6928 [QT/Win32] QT 한글 memcpy ㅠㅠ 도와주세요 (1) 05ho 11-03 557 0
6927 [QT/Embedded] c로 작성된 파일 include 방법 문의입니다. (2) crootk 11-03 544 0
 1  2  3  4  5  6  7  8  9  10    


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