PyQt6 блокировка клавиш
Я пытаюсь заблокировать определённые клавиши и их комбинации в PyQt6, такие как Alt+F4, Ctrl+Tab, Esc и другие.
def keyPressEvent(self, event: QKeyEvent):
forbidden_keys = [Qt.Key.Key_Control, Qt.Key.Key_Alt, Qt.Key.Key_Escape, Qt.Key.Key_Tab, Qt.Key.Key_F4]
if event.key() in forbidden_keys:
print("Заблокировано")
return
super().keyPressEvent(event)
Проблема в том, что одиночные клавиши иногда блокируются, иногда нет, а комбинации вроде Alt+F4 всё равно проходят и закрывают окно. Мне нужно сделать так, чтобы указанные клавиши и любые их сочетания с другими вообще не работали - чтобы закрыть окно или выполнить другое действие с их помощью было невозможно. Как правильно реализовать полную блокировку этих клавиш и их комбинаций в PyQt6, чтобы даже Alt+F4, Ctrl+W, Esc и прочие ничего не делали? Как добиться того, чтобы невозможно было закрыть окно указанными клавишами?
Ответы (1 шт):
Обработка комбинаций: Чтобы обработать комбинации, вам нужно проверять не только event.key(), но и модификаторы, такие как Qt.KeyboardModifier.ControlModifier, Qt.KeyboardModifier.AltModifier и т.д.
Перехват Alt+F4: Комбинация Alt+F4 является системной и обрабатывается оконным менеджером операционной системы на более низком уровне, чем события PyQt. Для её перехвата нужно использовать более мощный механизм - переопределение обработчика событий закрытия окна closeEvent.
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QKeyEvent, QCloseEvent
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Защищенное окно")
self.setGeometry(100, 100, 800, 600)
def closeEvent(self, event: QCloseEvent):
# Блокировка закрытия окна по Alt+F4 или через кнопку "Закрыть"
print("Попытка закрыть окно заблокирована!")
event.ignore()
def keyPressEvent(self, event: QKeyEvent):
# Блокировка одиночных клавиш
forbidden_single_keys = {
Qt.Key.Key_Escape,
Qt.Key.Key_Tab
}
if event.key() in forbidden_single_keys:
print("Блокировка одиночной клавиши:", Qt.Key(event.key()).name)
return
# Блокировка комбинаций с модификаторами
# Комбинация Alt+F4
if event.modifiers() == Qt.KeyboardModifier.AltModifier and event.key() == Qt.Key.Key_F4:
print("Блокировка Alt+F4")
return
# Комбинация Ctrl+W (Ctrl+F4 тоже можно добавить)
if event.modifiers() == Qt.KeyboardModifier.ControlModifier and event.key() == Qt.Key.Key_W:
print("Блокировка Ctrl+W")
return
# Комбинация Ctrl+Tab
if event.modifiers() == Qt.KeyboardModifier.ControlModifier and event.key() == Qt.Key.Key_Tab:
print("Блокировка Ctrl+Tab")
return
# Блокировка любого нажатия Ctrl
if event.key() == Qt.Key.Key_Control or event.modifiers() == Qt.KeyboardModifier.ControlModifier:
print("Блокировка Control")
return
# Если клавиша не заблокирована, передаем событие дальше
super().keyPressEvent(event)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec()