键盘快捷键替代方式

2024-04-26 11:45:09 发布

您现在位置:Python中文网/ 问答频道 /正文

不能为我的刽子手游戏设置快捷方式。除了使用QShortcut组件,还有其他方法绑定键盘快捷键吗

问题是,当我将它用于myPushButtonHandler()方法(它使用sender())时,它会抛出一个错误:'QShortcut' object has no attribute 'text'。我知道这是因为handler使用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的每个字母都指定给它的快捷键


Tags: 方法textinselffordefbutton快捷键
1条回答
网友
1楼 · 发布于 2024-04-26 11:45:09

您不必替换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_())

相关问题 更多 >