PyQt5 KeySequenceEdit не отображает клавиши F10... а вместо этого пишет текст

Я хочу отобразить в KeySequenceEdit клавиши F10, F11 и иже с ними, но вместо этого получаю, если это F10 то показывает "Media Play".

Как мне получать не описание этой клавиши, а саму клавишу?

Вот я нажал F10:

введите сюда описание изображения

введите сюда описание изображения

Код:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QKeySequenceEdit, QPushButton, QHBoxLayout
from PyQt5.QtGui import QKeySequence

class KeySequenceEdit(QKeySequenceEdit):
    def keyPressEvent(self, event):
        super().keyPressEvent(event)

        sequenceString = self.keySequence().toString(QKeySequence.NativeText)
        print(QKeySequence().fromString(sequenceString, QKeySequence.PortableText))
        if sequenceString:
            last_key_stroke = sequenceString#.split(',')[-1].strip()
            self.setKeySequence(QKeySequence(last_key_stroke))

class Detector(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1000, 130)

        mainLayout = QHBoxLayout()

        self._keysequenceEdit = KeySequenceEdit()
        mainLayout.addWidget(self._keysequenceEdit)

        button_clear = QPushButton('Clear', clicked=self._keysequenceEdit.clear)
        mainLayout.addWidget(button_clear)

        button_print = QPushButton('Print')
        button_print.clicked.connect(self.get_value)
        mainLayout.addWidget(button_print)

        self.setLayout(mainLayout)

    def get_value(self):
        sequence = self._keysequenceEdit.keySequence()
        sequenceString = sequence.toString(QKeySequence.NativeText)
        if sequenceString:
            print('Key stroke: {0}'.format(sequenceString))


app = QApplication(sys.argv)
app.setStyleSheet("""
    QLineEdit {font-size: 25px; height: 40px;}
    QPushButton {font-size: 25px; height: 40px;}
""")

demo = Detector()
demo.show()

sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

На моей клавиатуре

введите сюда описание изображения

я получаю F10 при наборе сочетания клавиш Fn+F10

введите сюда описание изображения

Fn — клавиша-модификатор, и внешне работает подобно другим клавишам-модификаторам, таким как Ctrl , , Shift и Alt .
При нажатии обычной клавиши-модификатора микроконтроллер в клавиатуре посылает скан-код самого модификатора, который операционная система распознаёт и комбинирует с кодами нажатых в то же время клавиш.


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QKeySequenceEdit, \
    QPushButton, QHBoxLayout
from PyQt5.QtGui import QKeySequence

class KeySequenceEdit(QKeySequenceEdit):
    def keyPressEvent(self, event):
        super().keyPressEvent(event)

        sequenceString = self.keySequence().toString(QKeySequence.NativeText)
        print(QKeySequence().fromString(sequenceString, QKeySequence.PortableText))
        print(f'sequenceString: {sequenceString}\n') #
        if sequenceString:
            last_key_stroke = sequenceString#.split(',')[-1].strip()
            self.setKeySequence(QKeySequence(last_key_stroke))


class Detector(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1000, 130)

        mainLayout = QHBoxLayout()

        self._keysequenceEdit = KeySequenceEdit()
        mainLayout.addWidget(self._keysequenceEdit)

        button_clear = QPushButton('Clear', clicked=self._keysequenceEdit.clear)
        mainLayout.addWidget(button_clear)

        button_print = QPushButton('Print')
        button_print.clicked.connect(self.get_value)
        mainLayout.addWidget(button_print)

        self.setLayout(mainLayout)

    def get_value(self):
        sequence = self._keysequenceEdit.keySequence()
        sequenceString = sequence.toString(QKeySequence.NativeText)
        if sequenceString:
            print('Key stroke: {0}'.format(sequenceString))


app = QApplication(sys.argv)
app.setStyleSheet("""
    QLineEdit {font-size: 25px; height: 40px;}
    QPushButton {font-size: 25px; height: 40px;}
""")

demo = Detector()
demo.show()

sys.exit(app.exec_())

Update

если я просто нажму F10 выводит "Media Play", можно ли в этом случае, например отфильтровать и просто игнорировать такие нажатия?

Все можно, попробуйте:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QKeySequenceEdit, \
    QPushButton, QHBoxLayout
from PyQt5.QtGui import QKeySequence


class KeySequenceEdit(QKeySequenceEdit):
    
    def keyPressEvent(self, event):
        super().keyPressEvent(event)

        sequenceString = self.keySequence().toString(QKeySequence.NativeText)
        print(QKeySequence().fromString(sequenceString, QKeySequence.PortableText))
        if sequenceString:
            last_key_stroke = sequenceString#.split(',')[-1].strip()

            if last_key_stroke == "Media Play":                         # +++
                last_key_stroke = "F10"                                 # +++
            
            self.setKeySequence(QKeySequence(last_key_stroke))


class Detector(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(1000, 130)

        mainLayout = QHBoxLayout()

        self._keysequenceEdit = KeySequenceEdit()
        mainLayout.addWidget(self._keysequenceEdit)

        button_clear = QPushButton('Clear', clicked=self._keysequenceEdit.clear)
        mainLayout.addWidget(button_clear)

        button_print = QPushButton('Print')
        button_print.clicked.connect(self.get_value)
        mainLayout.addWidget(button_print)

        self.setLayout(mainLayout)

    def get_value(self):
        sequence = self._keysequenceEdit.keySequence()
        sequenceString = sequence.toString(QKeySequence.NativeText)
        if sequenceString:
            print('Key stroke: {0}'.format(sequenceString))
            
        self._keysequenceEdit.setFocus()                                # +++

app = QApplication(sys.argv)
app.setStyleSheet("""
    QLineEdit {font-size: 25px; height: 40px;}
    QPushButton {font-size: 25px; height: 40px;}
""")

demo = Detector()
demo.show()

sys.exit(app.exec_())
→ Ссылка