예제 #1
0
class VirtualKeyboard(QWidget):

    def __init__(self, parent=None):
        super(VirtualKeyboard, self).__init__(parent)

        self.globalLayout = QVBoxLayout(self)
        self.keysLayout = QGridLayout()
        self.buttonLayout = QHBoxLayout()
        self.dictOfButtons = {}
        self.setStyleSheet("QWidget {"
                           "background-color: rgb(118, 118, 118);"
                           "color: rgb(240, 240, 240);"
                           "}"
                           ""
                           "QLabel{"
                           "color: rgb(240, 240, 240);"
                           "}"
                           "QPushButton{"
                           "background-color: rgb(42, 42, 42);"
                           "color: rgb(255, 255, 255);"
                           "border-style: solid;"
                           "border-color: black;"
                           "border-width: 5px;"
                           "border-radius: 10px;"
                           "font: 63 20pt 'Ubuntu';"
                           "}")
        self.keyListByLines = [
                    ['1','2','3','4','5','6','7','8','9','0',u'ß','?'],    # comment this line if you dont want numbers
                    ['q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', u'ü','+'],
                    ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', u'ö', u'ä','#' ],
                    ['y', 'x', 'c', 'v', 'b', 'n', 'm', '_', '-', '/', '.',':'],
                ]
        self.inputString = ""
        self.state = InputState.LOWER

        self.stateButton = QPushButton()
        self.stateButton.setText('Shift')
        self.backButton = QPushButton()
        self.backButton.setText(self.tr('Delete'))
        self.backButton.setFocusPolicy(Qt.NoFocus)
        self.okButton = QPushButton()
        self.okButton.setText('OK')
        self.okButton.setFocusPolicy(Qt.NoFocus)
        self.cancelButton = QPushButton()
        self.cancelButton.setText(self.tr("Abort"))
        self.cancelButton.setFocusPolicy(Qt.NoFocus)
        self.spaceButton = SpaceKeyButton(" ")
        self.spaceButton.setText(self.tr("Space"))
        self.dictOfButtons.update({"keyButton " : self.spaceButton})
        self.connect(self.spaceButton, SIGNAL("sigKeyButtonClicked"), self.addInputByKey)

        self.inputLine = QLineEdit()

        self.inputLine.setFont(font)


        for lineIndex, line in enumerate(self.keyListByLines):
            for keyIndex, key in enumerate(line):
                buttonName = "keyButton" + key.capitalize()
                self.dictOfButtons.update({buttonName : KeyButton(key)})
                self.keysLayout.addWidget(self.getButtonByKey(key), self.keyListByLines.index(line), line.index(key))
                self.getButtonByKey(key).setText(key)
                self.connect(self.getButtonByKey(key), SIGNAL("sigKeyButtonClicked"), self.addInputByKey)
                self.keysLayout.setColumnMinimumWidth(keyIndex, 50)
            self.keysLayout.setRowMinimumHeight(lineIndex, 50)

        self.connect(self.stateButton, SIGNAL("clicked()"), self.switchState)
        self.connect(self.backButton, SIGNAL("clicked()"), self.backspace)
        self.connect(self.okButton, SIGNAL("clicked()"), self.emitInputString)
        self.connect(self.cancelButton, SIGNAL("clicked()"), self.emitCancel)

        self.buttonLayout.addWidget(self.cancelButton)
        self.buttonLayout.addWidget(self.backButton)
        self.buttonLayout.addWidget(self.stateButton)
        self.buttonLayout.addWidget(self.okButton)

        self.globalLayout.addWidget(self.inputLine)
        self.globalLayout.addLayout(self.keysLayout)
        # construct a small horizontal layout, to assure that space-bare is in the middle of the keyboard...
        tmpLayout = QHBoxLayout()
        space = QSpacerItem(0,0)
        tmpLayout.addSpacerItem(space)
        tmpLayout.addWidget(self.spaceButton)
        tmpLayout.addSpacerItem(space)
        self.globalLayout.addLayout(tmpLayout)
        # self.globalLayout.addWidget(self.spaceButton)   # replaced with layout (tmpLayout)

        self.globalLayout.addLayout(self.buttonLayout)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))


    def getButtonByKey(self, key):
        dictKey = "keyButton" + key.capitalize()
        return self.dictOfButtons[dictKey]

    def getLineForButtonByKey(self, key):
        return [key in keyList for keyList in self.keyListByLines].index(True)

    def switchState(self):
        self.state = not self.state
        #print("State", self.state)
        if self.state == InputState.LOWER:
            for line in self.keyListByLines:
                for key in line:
                    self.getButtonByKey(key).setText(key.lower())
                    self.stateButton.clearFocus()
        if self.state == InputState.CAPITAL:
            for line in self.keyListByLines:
                for key in line:
                    self.getButtonByKey(key).setText(key.capitalize())

    def addInputByKey(self, key):
        self.inputString += (key.lower(), key.capitalize())[self.state]
        self.inputLine.setText(self.inputString)

    def backspace(self):
        self.inputLine.backspace()
        self.inputString = self.inputString[:-1]

    def emitInputString(self):
        self.emit(SIGNAL("sigInputString"), self.inputLine.text())

    def emitCancel(self):
        self.emit(SIGNAL("sigInputString"), "")

    def clearContent(self):
        self.inputLine.setText("")
        self.inputString = ""

    def sizeHint(self):
        return QSize(480,272)
예제 #2
0
class VirtualKeyboard(QWidget):
    def __init__(self, parent=None):
        super(VirtualKeyboard, self).__init__(parent)

        self.globalLayout = QVBoxLayout(self)
        self.keysLayout = QGridLayout()
        self.buttonLayout = QHBoxLayout()
        self.dictOfButtons = {}
        self.setStyleSheet("QWidget {"
                           "background-color: rgb(118, 118, 118);"
                           "color: rgb(240, 240, 240);"
                           "}"
                           ""
                           "QLabel{"
                           "color: rgb(240, 240, 240);"
                           "}"
                           "QPushButton{"
                           "background-color: rgb(42, 42, 42);"
                           "color: rgb(255, 255, 255);"
                           "border-style: solid;"
                           "border-color: black;"
                           "border-width: 5px;"
                           "border-radius: 10px;"
                           "font: 63 20pt 'Ubuntu';"
                           "}")
        self.keyListByLines = [
            ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', u'ß',
             '?'],  # comment this line if you dont want numbers
            ['q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', u'ü', '+'],
            ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', u'ö', u'ä', '#'],
            ['y', 'x', 'c', 'v', 'b', 'n', 'm', '_', '-', '/', '.', ':'],
        ]
        self.inputString = ""
        self.state = InputState.LOWER

        self.stateButton = QPushButton()
        self.stateButton.setText('Shift')
        self.backButton = QPushButton()
        self.backButton.setText(self.tr('Delete'))
        self.backButton.setFocusPolicy(Qt.NoFocus)
        self.okButton = QPushButton()
        self.okButton.setText('OK')
        self.okButton.setFocusPolicy(Qt.NoFocus)
        self.cancelButton = QPushButton()
        self.cancelButton.setText(self.tr("Abort"))
        self.cancelButton.setFocusPolicy(Qt.NoFocus)
        self.spaceButton = SpaceKeyButton(" ")
        self.spaceButton.setText(self.tr("Space"))
        self.dictOfButtons.update({"keyButton ": self.spaceButton})
        self.connect(self.spaceButton, SIGNAL("sigKeyButtonClicked"),
                     self.addInputByKey)

        self.inputLine = QLineEdit()

        self.inputLine.setFont(font)

        for lineIndex, line in enumerate(self.keyListByLines):
            for keyIndex, key in enumerate(line):
                buttonName = "keyButton" + key.capitalize()
                self.dictOfButtons.update({buttonName: KeyButton(key)})
                self.keysLayout.addWidget(self.getButtonByKey(key),
                                          self.keyListByLines.index(line),
                                          line.index(key))
                self.getButtonByKey(key).setText(key)
                self.connect(self.getButtonByKey(key),
                             SIGNAL("sigKeyButtonClicked"), self.addInputByKey)
                self.keysLayout.setColumnMinimumWidth(keyIndex, 50)
            self.keysLayout.setRowMinimumHeight(lineIndex, 50)

        self.connect(self.stateButton, SIGNAL("clicked()"), self.switchState)
        self.connect(self.backButton, SIGNAL("clicked()"), self.backspace)
        self.connect(self.okButton, SIGNAL("clicked()"), self.emitInputString)
        self.connect(self.cancelButton, SIGNAL("clicked()"), self.emitCancel)

        self.buttonLayout.addWidget(self.cancelButton)
        self.buttonLayout.addWidget(self.backButton)
        self.buttonLayout.addWidget(self.stateButton)
        self.buttonLayout.addWidget(self.okButton)

        self.globalLayout.addWidget(self.inputLine)
        self.globalLayout.addLayout(self.keysLayout)
        self.globalLayout.addWidget(self.spaceButton)

        self.globalLayout.addLayout(self.buttonLayout)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))

    def getButtonByKey(self, key):
        dictKey = "keyButton" + key.capitalize()
        return self.dictOfButtons[dictKey]

    def getLineForButtonByKey(self, key):
        return [key in keyList for keyList in self.keyListByLines].index(True)

    def switchState(self):
        self.state = not self.state
        #print("State", self.state)
        if self.state == InputState.LOWER:
            for line in self.keyListByLines:
                for key in line:
                    self.getButtonByKey(key).setText(key.lower())
                    self.stateButton.clearFocus()
        if self.state == InputState.CAPITAL:
            for line in self.keyListByLines:
                for key in line:
                    self.getButtonByKey(key).setText(key.capitalize())

    def addInputByKey(self, key):
        self.inputString += (key.lower(), key.capitalize())[self.state]
        self.inputLine.setText(self.inputString)

    def backspace(self):
        self.inputLine.backspace()
        self.inputString = self.inputString[:-1]

    def emitInputString(self):
        self.emit(SIGNAL("sigInputString"), self.inputLine.text())

    def emitCancel(self):
        self.emit(SIGNAL("sigInputString"), "")

    def clearContent(self):
        self.inputLine.setText("")
        self.inputString = ""

    def sizeHint(self):
        return QSize(480, 272)