#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_())