Клавиша [´] на большинстве клавиатур представляет собой « мертвую клавишу », особый вид клавиши, которая ожидает следующего, чтобы «составить» фактический символ.
Насколько насколько я знаю, эти клавиши можно получить только как событие отпускания, а не событие нажатия.
Когда некоторые мертвые клавиши нажимаются дважды, они не отправляются как события нажатия / отпускания клавиш. , но они могут быть перехвачены с event()
как QEvent.InputMethod
типов.
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
keyNameFromValue = {}
keyNameFromString = {}
for k, v in vars(Qt).items():
if isinstance(v, Qt.Key):
keyNameFromValue[v] = k
keyNameFromString[QKeySequence(v).toString()] = k
class App(QWidget):
def __init__(self, argv):
super().__init__()
layout = QVBoxLayout(self)
self.box = QLabel(self)
layout.addWidget(self.box)
self.show()
def event(self, ev):
if ev.type() == QEvent.InputMethod:
s = ev.commitString()
if s:
self.box.setText('InputMethod > {}: {}'.format(
keyNameFromString.get(s, '(Unknown)'), s))
self.box.adjustSize()
return super().event(ev)
def keyPressEvent(self, ev):
if not ev.isAutoRepeat():
self.box.setText('KeyPress > {}: {}'.format(
keyNameFromValue.get(ev.key()), ev.text()))
self.box.adjustSize()
super().keyPressEvent(ev)
def keyReleaseEvent(self, ev):
if not ev.isAutoRepeat():
self.box.setText('KeyRelease > {}: {}'.format(
keyNameFromValue.get(ev.key()), ev.text()))
self.box.adjustSize()
super().keyReleaseEvent(ev)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
ex = App(sys.argv)
sys.exit(app.exec_())
В этом случае при первом нажатии клавиши [´] результат будет Key_Dead_Acute
(который не может быть напечатан напрямую), а во второй раз это Key_acute
.
Вы можете создать свое собственное основанное на диктанте отображение для мертвых ключей (их менее 50), если вам нужно показать как печатный мертвый ключ должен выглядеть как строка.
К сожалению, нет никакого программного способа сделать это, так как их преобразование строки отличается даже для «того же» символа, и нет фактической корреляции между именами Qt.Key_Dead_*
и Qt.Key_*
или значения: например, пока * 102 3 * соответствует Qt.Key_acute
, Qt.Key_Dead_Grave
становится Qt.Key_QuoteLeft
.