Xử lý sự kiện bàn phím trong PyQt6 để điều khiển Widget

Mục tiêu

Trong lập trình giao diện với PyQt6, việc tương tác thông qua bàn phím là một phần quan trọng. Bài viết này hướng dẫn cách điều khiển vị trí của một nút bấm (QPushButton) trên cửa sổ ứng dụng bằng cách sử dụng các phím mũi tên (Lên, Xuống, Trái, Phải).

Triển khai mã nguồn

Dưới đây là ví dụ chi tiết về việc ghi đè phương thức xử lý sự kiện bàn phím để thay đổi tọa độ của thành phần giao diện:

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton
from PyQt6.QtCore import Qt

class KeyboardControlDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # Cấu hình cửa sổ chính
        self.setWindowTitle('Điều khiển Widget bằng bàn phím')
        self.setGeometry(100, 100, 500, 400)

        # Khởi tạo nút bấm
        self.moving_button = QPushButton('Di chuyển tôi', self)
        self.moving_button.setGeometry(200, 180, 100, 40)

        # Quan trọng: Thiết lập chính sách focus để nhận sự kiện bàn phím
        self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)

    def keyReleaseEvent(self, event):
        # Lấy tọa độ hiện tại của nút
        current_x = self.moving_button.pos().x()
        current_y = self.moving_button.pos().y()
        step = 10  # Khoảng cách di chuyển mỗi lần nhấn phím

        # Kiểm tra phím nào được nhấn
        key = event.key()

        if key == Qt.Key.Key_Left:
            current_x -= step
        elif key == Qt.Key.Key_Right:
            current_x += step
        elif key == Qt.Key.Key_Up:
            current_y -= step
        elif key == Qt.Key.Key_Down:
            current_y += step

        # Cập nhật vị trí mới cho nút bấm
        self.moving_button.move(current_x, current_y)
        
        # In tọa độ ra console để kiểm tra
        print(f"Vị trí mới: x={current_x}, y={current_y}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = KeyboardControlDemo()
    demo.show()
    sys.exit(app.exec())

Phân tích kỹ thuật

1. Chính sách tiêu điểm (Focus Policy)

Để một Widget có thể bắt được các sự kiện từ bàn phím, nó phải đang được "focus". Trong mã nguồn trên, chúng ta sử dụng:

self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)

Điều này cho phép cửa sổ nhận các sự kiện phím thông qua cả việc nhấn phím Tab hoặc click chuột vào cửa sổ.

2. Ghi đè sự kiện bàn phím

PyQt6 cung cấp hai phương thức chính để xử lý bàn phím là keyPressEvent (khi nhấn xuống) và keyReleaseEvent (khi thả phím ra). Trong ví dụ này, chúng ta sử dụng keyReleaseEvent để thực hiện thay đổi vị trí ngay khi người dùng hoàn tất thao tác nhấn.

3. Xác định phím và điều hướng

Hàm event.key() trả về mã định danh của phím được tác động. Chúng ta so sánh mã này với các hằng số trong lớp Qt.Key để xác định hướng di chuyển:

  • Qt.Key.Key_Left: Mũi tên trái (giảm tọa độ X).
  • Qt.Key.Key_Right: Mũi tên phải (tăng tọa độ X).
  • Qt.Key.Key_Up: Mũi tên lên (giảm tọa độ Y).
  • Qt.Key.Key_Down: Mũi tên xuống (tăng tọa độ Y).

4. Di chuyển thành phần

Phương thức move(x, y) của các đối tượng kế thừa từ QWidget được sử dụng để thay đổi vị trí tương đối của thành phần đó so với cửa sổ cha của nó. Tọa độ (0, 0) nằm ở góc trên cùng bên trái của cửa sổ.

Thẻ: PyQt6 python gui KeyboardEvents EventHandling

Đăng vào ngày 25 tháng 7 lúc 11:51