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






배너 신청 문의

 
작성일 : 17-11-06 13:46
[QT/Embedded] 라즈베리파이 내 키보드 동작 관련
 글쓴이 : 김촙촙
조회 : 976   추천 : 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,000
번호 제   목 글쓴이 날짜 조회 추천
7000 [QT/Win32] qt addTab에서 enw instance 할시 배경이미지를 불… (1) LightSlive 05-19 41 0
6999 [QT/X11] string to time_t로 큐티공… 05-17 40 0
6998 [QT/Embedded] 타이머를 이용해서 자동을 화면을 전환 하고 … 신형군 05-17 43 0
6997    [QT/Embedded] 타이머를 이용해서 자동을 화면을 전환 하고 … devopia 05-18 111 0
6996 [QT/Win32] QTableView 에 DragDrop 기능 구현 질문 입니다. NaturalSof… 05-16 40 0
6995    [QT/Win32] QTableView 에 DragDrop 기능 구현 질문 입니다. devopia 05-17 107 0
6994 [QT/Win32] tab order qttest 05-16 45 0
6993 [QT/Embedded] 중첩된 프레임 버퍼를 한 이미지로 저장할 수… (1) 하오링… 05-15 57 0
6992 [QT/Win32] qlabel link걸기 (1) qttest 05-14 65 0
6991 [QT/Embedded] QWebEngineView위에 그림 그리기 (1) 오리오… 05-14 70 0
6990 [QT/Embedded] qwtPlotGrid 질문 콩콩2 05-08 110 0
6989    [QT/Win32] qwtPlotGrid 질문 devopia 05-09 195 0
6988 [QT/Embedded] 그림이 뒤로 깔리는 문제 오리오… 05-08 108 0
6987 [QT/Win32] DockWidget을 자유롭게 배치하려고합니다. (2) tt33 05-02 159 0
6986 [QT/Embedded] QT TextEdit에 작성된 글자를 quint8로 변경하는 … (1) 나야나 05-02 145 0
6985 [QT/Embedded] QLCDNumber 범위값 설정 문제 관련하여 질문드립… (2) 김촙촙 05-01 146 0
6984 [QT/Embedded] QWidget 타입의 값 비교 질문드립니다. (3) 규르 05-01 169 0
6983 [QT/Win32] IP 카메라 스트리밍 관련 질문 흑참 04-30 147 0
6982 [QT/Embedded] radiobutton 선택표시 질문 드립니다. (2) 규르 04-30 149 0
6981 [QT/X11] QTimer 설전문의 태백 04-30 128 0
6980 [QT/Embedded] QT tabtWidget 관해서 질문 드립니다. (3) 규르 04-27 166 0
6979 [QT/Embedded] quint8에서 QString으로 변경 방법에 대해 문의 … (4) 나야나 04-27 180 0
6978 [QT/Win32] 디버깅 에러 질문... (1) 흠냥 04-25 151 0
6977 [QT/Embedded] 지도 위에 그림 그리기 오리오… 04-24 135 0
6976 [QT/Win32] QT 웹호스팅 db값 받아오기 (2) 왕치킨… 04-19 152 0
6975 [QT/Embedded] qt 5.10에서 구글맵 넣는법 오리오… 04-18 158 0
6974 [QT/Embedded] rotate 문제 (1) 오리오… 04-13 198 0
6973 [QT/X11] qt update()->paint()함수 호출하는데 UI 업데이… (2) bash001 04-13 187 0
6972 [QT/X11] qt 5.9버전을 다운받아 설치하니깐 build 모드가… (1) 태백 04-12 201 0
6971 [QT/Win32] Qt 5.5 CDB문제 (1) Sad7Dayz 04-12 199 0
 1  2  3  4  5  6  7  8  9  10    


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