Проблемы с созданием обработчика нажатий клавиш
Создаю окно настроек, состоящее из label-ов, в которых записано на какую кнопку стоит бинд.
Мне надо, чтобы при нажатии мышкой на label он выделялся и при нажатии на любую кнопку клавиатуры в label записывалось это значение.
Т.е. например при нажатии на кнопку alt, у выделенного label'а менялся текст на alt, и при выборе другого label'a с предыдущего снималось выделение.
Вот код:
class mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, data, parent=None):
super(mywindow, self).__init__(parent)
self.setupUi(self)
self.avtoebt.installEventFilter(self)
self.fastbybt.installEventFilter(self)
self.fastlvbt.installEventFilter(self)
self.avote2bt.installEventFilter(self)
self.scanbt.installEventFilter(self)
self.set.installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == 2 and source is not self.set:
#выделяет рамкой выбранный label
source.setStyleSheet("""background: #23272A;
border-style: solid;
border-width: 2px;
border-color: #9900ff;
font-family: Impact;
font-style: bold;
font-weight: normal;
font-size: 15px;
line-height: 58px;
text-align: center;
color: #FFFFFF;""")
#как-то отловить нажатую клавишу
source.setText(key)
return False
def main():
app = QtWidgets.QApplication(sys.argv)
application = mywindow()
application.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Yant, то что вы предоставили, не является минимально-воспроизводимым примером.
Пожалуйста, всегда предоставляйте минимально-воспроизводимым примером.
То что вы хотите сделать, может выглядеть примерно так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
# -----------------------------------> vvvvvvvvvvvvv <------------- ???
#class mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
# --------------------> vvvv <------------------------------------- ???
# def __init__(self, data, parent=None):
class MyWindow(QtWidgets.QMainWindow): #, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
# self.setupUi(self)
self.сentralWidget = QtWidgets.QWidget()
self.сentralWidget.setObjectName("сentralWidget")
self.setCentralWidget(self.сentralWidget)
self.avtoebt = QLabel()
self.avtoebt.setObjectName('avtoebt')
self.avtoebt.setStyleSheet("background: #E79E4F;")
self.avtoebt.installEventFilter(self)
self.fastbybt = QLabel()
self.fastbybt.setObjectName('fastbybt')
self.fastbybt.setStyleSheet("background: #E79E4F;")
self.fastbybt.installEventFilter(self)
self.fastlvbt = QLabel()
self.fastlvbt.setObjectName('fastlvbt')
self.fastlvbt.setStyleSheet("background: #E79E4F;")
self.fastlvbt.installEventFilter(self)
self.avote2bt = QLabel()
self.avote2bt.setObjectName('avote2bt')
self.avote2bt.setStyleSheet("background: #E79E4F;")
self.avote2bt.installEventFilter(self)
self.scanbt = QLabel()
self.scanbt.setObjectName('scanbt')
self.scanbt.setStyleSheet("background: #E79E4F;")
self.scanbt.installEventFilter(self)
self.set = QLabel('SET')
self.set.setObjectName('set')
self.set.setStyleSheet("background: #A05344;")
self.set.installEventFilter(self)
layout = QGridLayout(self.сentralWidget)
layout.addWidget(self.avtoebt, 0, 0)
layout.addWidget(self.fastbybt, 1, 0)
layout.addWidget(self.fastlvbt, 2, 0)
layout.addWidget(self.avote2bt, 0, 1)
layout.addWidget(self.scanbt, 1, 1)
layout.addWidget(self.set, 2, 1)
self.labels = {
self.avtoebt: False,
self.fastbybt: False,
self.fastlvbt: False,
self.avote2bt: False,
self.scanbt: False,
self.set: False,
}
self.label_selected = None
self.keymap = {}
for key, value in vars(Qt).items():
if isinstance(value, Qt.Key):
self.keymap[value] = key.partition('_')[2]
self.modmap = {
Qt.ControlModifier: self.keymap[Qt.Key_Control],
Qt.AltModifier: self.keymap[Qt.Key_Alt],
Qt.ShiftModifier: self.keymap[Qt.Key_Shift],
Qt.MetaModifier: self.keymap[Qt.Key_Meta],
Qt.GroupSwitchModifier: self.keymap[Qt.Key_AltGr],
Qt.KeypadModifier: self.keymap[Qt.Key_NumLock],
}
def eventFilter(self, source, event):
if event.type() == 2 and source is not self.set:
for label in self.labels:
if source is label:
label.setStyleSheet(f"""
#{label.objectName()} {{
background: #23272A;
border-style: solid;
border-width: 2px;
border-color: #9900ff;
font-family: Impact;
font-style: bold;
font-weight: normal;
font-size: 15px;
line-height: 58px;
text-align: center;
color: #FFFFFF;
}}
""")
self.label_selected = label
elif label is not self.set:
label.setStyleSheet(f"""
#{label.objectName()} {{
background: #E79E4F;
}}
""")
return super().eventFilter(source, event)
def keyevent_to_string(self, event):
sequence = []
for modifier, text in self.modmap.items():
if event.modifiers() & modifier:
sequence.append(text)
key = self.keymap.get(event.key(), event.text())
if key not in sequence:
sequence.append(key)
return '+'.join(sequence)
# отловить нажатую клавишу
def keyPressEvent(self, event):
#print(self.keyevent_to_string(event))
if self.label_selected:
self.label_selected.setText(self.keyevent_to_string(event))
super().keyPressEvent(event)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
app.setFont(QFont("Times", 12, QFont.Bold))
w = MyWindow()
w.resize(200, 300)
w.show()
sys.exit(app.exec_())

