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






배너 신청 문의

 
작성일 : 17-11-06 13:46
[QT/Embedded] 라즈베리파이 내 키보드 동작 관련
 글쓴이 : 김촙촙
조회 : 1,348   추천 : 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,023
번호 제   목 글쓴이 날짜 조회 추천
7023 홈앤쇼핑, 배연정 소머리곰탕…과대·과장 광… jgqatnr482 09:13 0 0
7022 [QT/X11] 영상이 main 루프에서는 나오는데 thread 에서는… (1) 깨굴 08-17 21 0
7021 [QT/Win32] qlabel에 이미지를 가운데에 위치시키는방법이… qweret123 08-14 30 0
7020 [QT/Embedded] QML 에서 shader effect 를 사용할 때... devilqoo 08-10 50 0
7019 [QT/Win32] QT jpg파일을 움직이게 애니메이션효과를 주고… (1) 우준 07-26 189 0
7018 [QT/Embedded] 보드에 여러가지 테마 적용 질문드립니다. 규르 07-25 148 0
7017 [QT/Embedded] [QT/QML]Image (png파일) 로드하기전 사이즈 체크… (1) 벨제붑 07-20 214 0
7016 [QT/Win32] qt html5 다국어 지원 오닝그 07-10 233 0
7015 [QT/X11] Qprocess로 스트림영상을 QFrame(혹은 다른)에 보… (4) 깨굴 07-05 397 0
7014 [QT/Embedded] 한글 깨져서 문의 드립니다. (11) 트링 07-04 500 0
7013 [QT/Win32] error: 'qtConfig' is not a recognized test functio… (6) cbt0949 06-28 416 0
7012 [QT/Embedded] QPushButton 기본 상태 주기 (1) NaturalSof… 06-27 313 0
7011 [QT/X11] library 합치기? 깨굴 06-27 250 0
7010 [QT/Embedded] 한글 출력에 대해 질문 드립니다. (1) 트링 06-27 320 0
7009 [QT/Win32] eventFilter 함수 내에서 treeView내의 index 얻는 문… (9) cbt0949 06-26 337 0
7008    [QT/X11] eventFilter 함수 내에서 treeView내의 index 얻는 문… cbt0949 06-27 255 0
7007    [QT/Win32] eventFilter 함수 내에서 treeView내의 index 얻는 문… (1) devopia 06-27 235 1
7006 [QT/Embedded] QWebEngine 위에 그림 그리기 (10만원 겁니다) (2) 오리꽥 06-25 343 0
7005    [QT/Win32] QWebEngine 위에 그림 그리기 (10만원 겁니다) devopia 06-26 248 0
7004 [QT/Embedded] QML이 사용하는 GPU memory 측정. (2) devilqoo 06-19 305 0
7003 [QT/Embedded] QWebEngine 위에 그림 그리기 (5만원 겁니다) (3) 오리꽥 06-12 399 0
7002 [QT/Embedded] QCombobox stylesheet 질문드립니다. (1) 규르 06-08 352 0
7001 [QT/Embedded] QWebEngine 위에 그림 그리기 (3만원 겁니다) 오리꽥 06-01 456 0
7000 [QT/Win32] Qt Tcp 에러 문제 (1) Sad7Dayz 05-29 494 0
6999 [QT/Win32] qt addTab에서 enw instance 할시 배경이미지를 불… (1) LightSlive 05-19 456 0
6998 [QT/X11] string to time_t로 큐티공… 05-17 389 0
6997 [QT/Embedded] 타이머를 이용해서 자동을 화면을 전환 하고 … 신형군 05-17 452 0
6996    [QT/Embedded] 타이머를 이용해서 자동을 화면을 전환 하고 … devopia 05-18 490 0
6995 [QT/Win32] QTableView 에 DragDrop 기능 구현 질문 입니다. NaturalSof… 05-16 425 0
6994    [QT/Win32] QTableView 에 DragDrop 기능 구현 질문 입니다. devopia 05-17 501 0
 1  2  3  4  5  6  7  8  9  10    


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