라즈베리파이 내 키보드 동작 관련 > QT 질문/답변

본문 바로가기
사이트 내 전체검색

QT 질문/답변

QT/Embedded 라즈베리파이 내 키보드 동작 관련

페이지 정보

작성자 no_profile 김촙촙 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 2건 조회 2,154회 작성일 17-11-06 13:46

본문

라즈베리파이에 가스센서 감지 임베디드 시스템을 구축하고있습니다.

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

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

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

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

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

from PyQt4 import QtGui, QtCore
from decimal import Decimal

# 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_()

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

.

추천0

댓글목록

devopia님의 댓글

no_profile devopia 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

근본 문제는 무선 장치가 해당 디바이스에서 아무 문제없이 사용되도록 하는 것 아닐까요?
가상 키보드는 Qt에서 지원하기 보다는 해당 OS에서 지원하는 것을 찾아 보시길...
만약 Qt에서 해답을 찾고자 한다면 Qt에서 제공하는 가상 키보드를 이용하면 될 것 같네요. 단 QML 버전입니다.
위젯에서 사용하려면 QQuickWidget을 이용하는 방법이 있습니다.

Total 7,052건 1 페이지
QT 질문/답변 목록
번호 제목 글쓴이 조회 추천 날짜
7052 QT/Embedded no_profile 고씨 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 18 0 02-20
7051 QT/Embedded no_profile tjdudejr 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 17 0 02-20
7050 QT/Embedded no_profile QT왕초보보보보보 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 47 0 02-15
7049 QT/Win32 no_profile 윤자 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 48 0 02-14
7048 QT/X11 no_profile 빅토고 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 43 0 02-13
7047 QT/Win32 no_profile 동도리군 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 50 0 02-12
7046 QT/Embedded no_profile thisistophs 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 88 0 02-06
7045 QT/Win32 no_profile amond20 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 136 0 01-30
7044 QT/Embedded no_profile thisistophs 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 150 0 01-30
7043 QT/Embedded no_profile 둣바이홋 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 173 0 01-23
7042 QT/Embedded no_profile 은빛늑돌이 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 203 0 01-21
7041 QT/Win32 no_profile devopia 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 153 0 01-23
7040 QT/Win32 no_profile 엔트로피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 205 0 01-21
7039 QT/Embedded no_profile 원숭2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 202 0 01-19
7038 QT/Win32 no_profile qtqt해 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 330 0 01-10
7037 QT/Win32 no_profile 원숭2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 418 0 01-08
7036 QT/Embedded no_profile devilqoo 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 313 0 01-07
7035 QT/X11 no_profile 토고찡 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 324 0 01-02
7034 QT/Win32 no_profile 원숭2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 372 0 12-27
7033 QT/X11 no_profile 아아 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 419 0 12-24
7032 QT/Embedded no_profile 둣바이홋 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 295 0 12-20
7031 QT/Win32 no_profile 원숭2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 363 0 12-20
7030 QT/Win32 no_profile sanomu 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 398 0 12-19
7029 QT/X11 no_profile 아아 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 314 0 12-19
7028 QT/Embedded no_profile 원숭2 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 398 0 12-17
7027 QT/Win32 no_profile qtqt해 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 410 0 12-12
7026 QT/X11 no_profile 하빈 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 394 0 12-07
7025 QT/X11 no_profile 장주영 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 406 0 12-07
7024 QT/Embedded no_profile 둣바이홋 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 577 0 11-29
7023 QT/Win32 no_profile 지루 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 432 0 11-29
게시물 검색

  • 게시물이 없습니다.

회원로그인

설문조사

새로운 홈페이지에 대한 평가

접속자집계

오늘
23
어제
316
최대
3,878
전체
4,082,179

Copyright © korone.net. All rights reserved.