0

无法为我的 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 的每个字母分配给它的快捷方式。

4

1 回答 1

2

您不必替换 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_())
于 2019-04-18T18:58:35.227 回答