-
-
Save arunreddy/ee01b4ccdd1f2e5773cdd5352783d9c6 to your computer and use it in GitHub Desktop.
import sys | |
from PyQt5.QtCore import * | |
from PyQt5.QtGui import * | |
from PyQt5.Qt import Qt | |
from PyQt5.QtWidgets import * | |
class VKQLineEdit(QLineEdit): | |
def __init__(self, parent=None, name=None, mainWindowObj=None): | |
super(VKQLineEdit, self).__init__(parent) | |
self.name = name | |
self.setFixedHeight(40) | |
self.mainWindowObj = mainWindowObj | |
self.setFocusPolicy(Qt.ClickFocus) | |
def focusInEvent(self, e): | |
self.mainWindowObj.keyboardWidget.currentTextBox = self | |
self.mainWindowObj.keyboardWidget.show() | |
# self.setStyleSheet("border: 1px solid red;") | |
super(VKQLineEdit, self).focusInEvent(e) | |
def mousePressEvent(self, e): | |
# print(e) | |
# self.setFocusPolicy(Qt.ClickFocus) | |
super(VKQLineEdit, self).mousePressEvent(e) | |
class KeyboardWidget(QWidget): | |
def __init__(self, parent=None): | |
super(KeyboardWidget, self).__init__(parent) | |
self.currentTextBox = None | |
self.signalMapper = QSignalMapper(self) | |
self.signalMapper.mapped[int].connect(self.buttonClicked) | |
self.initUI() | |
def initUI(self): | |
layout = QGridLayout() | |
# p = self.palette() | |
# p.setColor(self.backgroundRole(),Qt.white) | |
# self.setPalette(p) | |
self.setAutoFillBackground(True) | |
self.text_box = QTextEdit() | |
self.text_box.setFont(QFont('Arial', 12)) | |
# text_box.setFixedHeight(50) | |
# self.text_box.setFixedWidth(300) | |
layout.addWidget(self.text_box, 0, 0, 1, 13) | |
names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', | |
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', | |
'1', '2', '3', '4', '5', '5', '7', '8', '9', '0', '.', '(', ')'] | |
positions = [(i + 1, j) for i in range(3) for j in range(13)] | |
for position, name in zip(positions, names): | |
if name == '': | |
continue | |
button = QPushButton(name) | |
button.setFont(QFont('Arial', 12)) | |
button.setFixedHeight(25) | |
button.setFixedWidth(25) | |
button.KEY_CHAR = ord(name) | |
button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(button, button.KEY_CHAR) | |
layout.addWidget(button, *position) | |
# Cancel button | |
cancel_button = QPushButton('Cancel') | |
cancel_button.setFixedHeight(25) | |
cancel_button.setFont(QFont('Arial', 12)) | |
cancel_button.KEY_CHAR = Qt.Key_Cancel | |
layout.addWidget(cancel_button, 5, 0, 1, 2) | |
cancel_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(cancel_button, cancel_button.KEY_CHAR) | |
cancel_button.setFixedWidth(60) | |
# Cancel button | |
clear_button = QPushButton('Clear') | |
clear_button.setFixedHeight(25) | |
clear_button.setFont(QFont('Arial', 12)) | |
clear_button.KEY_CHAR = Qt.Key_Clear | |
layout.addWidget(clear_button, 5, 2, 1, 2) | |
clear_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(clear_button, clear_button.KEY_CHAR) | |
clear_button.setFixedWidth(60) | |
# Space button | |
space_button = QPushButton('Space') | |
space_button.setFixedHeight(25) | |
space_button.setFont(QFont('Arial', 12)) | |
space_button.KEY_CHAR = Qt.Key_Space | |
layout.addWidget(space_button, 5, 4, 1, 3) | |
space_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(space_button, space_button.KEY_CHAR) | |
space_button.setFixedWidth(85) | |
# Back button | |
back_button = QPushButton('Back') | |
back_button.setFixedHeight(25) | |
back_button.setFont(QFont('Arial', 12)) | |
back_button.KEY_CHAR = Qt.Key_Backspace | |
layout.addWidget(back_button, 5, 7, 1, 2) | |
back_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(back_button, back_button.KEY_CHAR) | |
back_button.setFixedWidth(60) | |
# Enter button | |
enter_button = QPushButton('Enter') | |
enter_button.setFixedHeight(25) | |
enter_button.setFont(QFont('Arial', 12)) | |
enter_button.KEY_CHAR = Qt.Key_Enter | |
layout.addWidget(enter_button, 5, 9, 1, 2) | |
enter_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(enter_button, enter_button.KEY_CHAR) | |
enter_button.setFixedWidth(60) | |
# Done button | |
done_button = QPushButton('Done') | |
done_button.setFixedHeight(25) | |
done_button.setFont(QFont('Arial', 12)) | |
done_button.KEY_CHAR = Qt.Key_Home | |
layout.addWidget(done_button, 5, 11, 1, 2) | |
done_button.clicked.connect(self.signalMapper.map) | |
self.signalMapper.setMapping(done_button, done_button.KEY_CHAR) | |
done_button.setFixedWidth(60) | |
self.setGeometry(0, 0, 480, 300) | |
self.setLayout(layout) | |
def buttonClicked(self, char_ord): | |
txt = self.text_box.toPlainText() | |
if char_ord == Qt.Key_Backspace: | |
txt = txt[:-1] | |
elif char_ord == Qt.Key_Enter: | |
txt += chr(10) | |
elif char_ord == Qt.Key_Home: | |
self.currentTextBox.setText(txt) | |
self.text_box.setText("") | |
self.hide() | |
return | |
elif char_ord == Qt.Key_Clear: | |
txt = "" | |
elif char_ord == Qt.Key_Space: | |
txt += ' ' | |
else: | |
txt += chr(char_ord) | |
self.text_box.setText(txt) | |
class KeyboardUI(QMainWindow): | |
def __init__(self): | |
super().__init__() | |
self.initUI() | |
def initUI(self): | |
first_name = VKQLineEdit(name='First Name', mainWindowObj=self) | |
last_name = VKQLineEdit(name='Last Name', mainWindowObj=self) | |
mainWidget = QWidget() | |
layout = QGridLayout() | |
layout.addWidget(first_name, 0, 0) | |
layout.addWidget(last_name, 1, 0) | |
self.keyboardWidget = KeyboardWidget() | |
layout.addWidget(self.keyboardWidget, 0, 0, 10, 10) | |
mainWidget.setLayout(layout) | |
self.keyboardWidget.hide() | |
self.setCentralWidget(mainWidget) | |
self.statusBar().showMessage('Ready') | |
self.setGeometry(0, 0, 480, 320) | |
self.setWindowTitle('StethoX v1.0') | |
self.show() | |
if __name__ == '__main__': | |
app = QApplication([]) | |
ex = KeyboardUI() | |
ex.show() | |
sys.exit(app.exec_()) |
hi
thank you for this class
how can i use this class in my projects
like this:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(500, 500)
MainWindow.setMinimumSize(QtCore.QSize(500, 500))
MainWindow.setMaximumSize(QtCore.QSize(500, 500))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(-10, 260, 511, 211))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(180, 40, 113, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setGeometry(QtCore.QRect(180, 80, 113, 20))
self.lineEdit_3.setObjectName("lineEdit_3")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
if name == "main":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Hi,
I've found writing something and then pushing cancel the following error:
./virtual_keyboard.py
Traceback (most recent call last):
File "./virtual_keyboard.py", line 162, in buttonClicked
txt += chr(char_ord)
ValueError: chr() arg not in range(0x110000)
Aborted (core dumped)
I've done a simple modification as follows:
diff virtual_keyboard virtual_keyboard.py
0a1,4
157c161
< else:
159c163,165
<