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)
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)