Как настроить обработку нажатий клавиш на клавиатуре в PyQt5?

Как вы можете объяснить, как работает каждая функция в приведенном коде на Python, который использует библиотеку PyQt5 для создания приложения с графическим интерфейсом?
  • 28 октября 2024 г. 10:32
Ответы на вопрос 2
В PyQt5 обработка нажатий клавиш на клавиатуре может быть выполнена с помощью переопределения метода `keyPressEvent`. Ниже приведен пример кода, который демонстрирует, как это сделать, а затем я объясню каждую часть кода.

```python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

class MyWindow(QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        
        self.label = QLabel("Нажмите любую клавишу", self)
        self.label.setGeometry(100, 100, 300, 50)
        
        self.setWindowTitle("Обработка клавиш")
        self.setGeometry(100, 100, 400, 300)

    def keyPressEvent(self, event):
        key = event.key()
        self.label.setText(f"Вы нажали: {event.text()} (код: {key})")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
```

### Пояснение кода:

1. **Импорт необходимых модулей**:
   ```python
   import sys
   from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
   ```
   Здесь мы импортируем модуль `sys`, чтобы работать с аргументами командной строки и управлять жизненным циклом приложения, а также классы `QApplication`, `QMainWindow` и `QLabel` из библиотеки PyQt5 для создания оконного интерфейса.

2. **Создание класса окна**:
   ```python
   class MyWindow(QMainWindow):
   ```
   Мы создаем класс `MyWindow`, который наследуется от `QMainWindow`. Этот класс будет представлять основное окно приложения.

3. **Инициализация окна**:
   ```python
   def __init__(self):
       super(MyWindow, self).__init__()
       
       self.label = QLabel("Нажмите любую клавишу", self)
       self.label.setGeometry(100, 100, 300, 50)
       
       self.setWindowTitle("Обработка клавиш")
       self.setGeometry(100, 100, 400, 300)
   ```
   В методе `__init__` мы:
   - Вызываем инициализацию родительского класса `QMainWindow` с помощью `super()`.
   - Создаем метку `QLabel`, которая отображает текст "Нажмите любую клавишу".
   - Устанавливаем заголовок окна с помощью `setWindowTitle`.
   - Устанавливаем размеры и положение окна с помощью `setGeometry`.

4. **Обработка нажатий клавиш**:
   ```python
   def keyPressEvent(self, event):
       key = event.key()
       self.label.setText(f"Вы нажали: {event.text()} (код: {key})")
   ```
   Метод `keyPressEvent` вызывается при нажатии клавиш. В этом методе:
   - Мы получаем объект события `event`, который содержит информацию о нажатой клавише.
   - Используем `event.key()` для получения кода нажатой клавиши и `event.text()` для получения символа.
   - Обновляем текст метки, чтобы отобразить, какая клавиша была нажата.

5. **Запуск приложения**:
   ```python
   if __name__ == "__main__":
       app = QApplication(sys.argv)
       window = MyWindow()
       window.show()
       sys.exit(app.exec_())
   ```
   - Проверяем, запускается ли скрипт как основная программа.
   - Создаем экземпляр приложения `QApplication`.
   - Создаем экземпляр нашего окна `MyWindow`.
   - Вызываем метод `show()`, чтобы отобразить окно.
   - Запускаем главный цикл приложения с помощью `app.exec_()` и ждем его завершения. `sys.exit()` помогает корректно завершить процесс.

Этот код демонстрирует базовое использование PyQt5 для обработки нажатий клавиш и отображения информации в графическом интерфейсе.
В цикле создания кнопок сразу их инициализировать, используя метод setShortcut класса QPushButton , чтобы связать функцию с конкретной клавишей? 
for i in range(10):
    number_i = QPushButton(str(i))
    number_i.setShortcut(keys[i])
    number_i.clicked.connect(lambda i=i: text_input(i))
    but_num.append(number_i)


То же и для операций:
but_op = []
operations = ["+", "-", "*", "/"]
for op in operations:
    button = QPushButton(op)
    button.setShortcut(QKeySequence(Qt.Key_Plus if op == "+" else Qt.Key_Minus if op == "-" else Qt.Key_Asterisk if op == "*" else Qt.Key_Slash))
    button.clicked.connect(lambda op=op: operations_input(op))
    but_op.append(button)
Похожие вопросы