Сочетания клавиш — альтернативный способ

#python #pyqt5

#python #pyqt5

Вопрос:

Не удается установить сочетания клавиш для моей игры Hangman. Есть ли какой-либо альтернативный способ привязки сочетаний клавиш, кроме использования компонента QShortcut?

Проблема в том, что когда я использую его для метода myPushButtonHandler() (который, к сожалению, использует sender()), он выдает ошибку: 'QShortcut' object has no attribute 'text' . Я знаю, что это потому, что обработчик использует sender().text() для распознавания, какая клавиша (также отображается на экране) была нажата.

 def buttonClick(self):
    letter = self.sender().text()
    ...
    MUCH more code...
    ...


def setRow(self, row, letters):
    for letter in letters:
        button = QPushButton(letter)
        self.buttons.append(button)
        self.shortcuts.append(QShortcut(QKeySequence(letter), self))
        self.shortcuts[-1].activated.connect(self.buttonClick)
        button.setStyleSheet(QPushButtonStyle   "border: 3px solid #73ff38;")
        row.addWidget(button)
    return row

...
...
...


def setButtons(self):
    for button in self.buttons :
        button.clicked.connect(self.buttonClick)
 

Есть ли какой-нибудь «хитрый» способ избежать этой проблемы? Мне нужно присвоить каждой букве от A до Z ее ярлык.

Ответ №1:

Вам не нужно заменять QShortcut, вам нужно определить, какой тип sender() вызывает этот слот, и применить соответствующий метод для каждого типа

 import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.buttons = []
        self.shortcuts = []
        row = QtWidgets.QHBoxLayout(self)
        letters = list("ABCDEFG")
        self.setRow(row, letters)
        self.setButtons()

    def setRow(self, row, letters):
        for letter in letters:
            button = QtWidgets.QPushButton(letter)
            # button.setStyleSheet(QPushButtonStyle   "border: 3px solid #73ff38;")
            shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(letter), self)
            shortcut.activated.connect(self.buttonClick)
            self.buttons.append(button)
            self.shortcuts.append(shortcut)
            row.addWidget(button)

    def setButtons(self):
        for button in self.buttons:
            button.clicked.connect(self.buttonClick)

    @QtCore.pyqtSlot()
    def buttonClick(self):
        letter = ""
        if isinstance(self.sender(), QtWidgets.QPushButton):
            letter = self.sender().text()
        elif isinstance(self.sender(), QtWidgets.QShortcut):
            letter = self.sender().key().toString(QtGui.QKeySequence.NativeText)
        print(letter)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())