PyQt6 блокировка клавиш

Рейтинг: 1Ответов: 1Опубликовано: 26.07.2025

Я пытаюсь заблокировать определённые клавиши и их комбинации в 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 и прочие ничего не делали? Как добиться того, чтобы невозможно было закрыть окно указанными клавишами?

Ответы

▲ 3Принят

Обработка комбинаций: Чтобы обработать комбинации, вам нужно проверять не только 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()