PyQt| Thao tác giữa giao diện và sự kiện


S tương tác ca mt ng dng quá trình qua li gia ngưi dùng h thng, nơi ngưi dùng thc hin các hành đng thông qua giao din ng dng phn hi li nhng hành đng đó. Quá trình này to nên mt tri nghim ngưi dùng t , giúp ngưi dùng đt đưc mc tiêu ca mình khi s dng ng dng. 

 

Các chế trong PyQt đ phn hi li tương tác ca ngưi dùng: 

1. Signal slot: 

  • Signal: tín hiu thông báo rng mt s kin hoc hành đng đã xy ra. Signal thưng đưc gn lin vi mt đi ng (widget) c th 

d signal gn vi đi ng QPushButton: 

  • clicked(): phát ra khi nút đưc nhn 

  • pressed(): phát ra khi nút đưc nhn xung (nhưng chưa đưc th ra) 

  • released(): phát ra khi nút đưc th ra (sau khi nhn. 

d signal gn vi đi ng QLineEdit: 

  • textChanged(str): phát ra khi văn bn trong ô nhp liu thay đi 

  • returnPressed(): Phát ra khi ngưi dùng nhn phím Enter trong ô nhp liu. 

  • Slot: các hàm hoc phương thc đưc gi đ x mt signal khi đưc phát ra. Slot th các hàm đưc đnh nghĩa bi ngưi dùng hoc các slot sn trong PyQt. 

d s dng Signal - Slot: 

from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel 

 

class MyApp(QWidget): 

   def __init__(self): 

       super().__init__() 

 

       self.label = QLabel('Button not clicked', self) 

       btn = QPushButton('Click me', self) 

       btn.clicked.connect(self.onButtonClick# Kết ni signal 'clicked' vi slot 'onButtonClick' 

 

       self.label.move(50, 50) 

       btn.move(50, 100) 

 

       self.setGeometry(300, 300, 200, 150) 

       self.setWindowTitle('Signal-Slot Example') 

       self.show() 

 

   def onButtonClick(self): 

       self.label.setText('Button clicked!') 

 

if __name__ == '__main__': 

   app = QApplication([]) 

   ex = MyApp() 

   app.exec() 

Gii thích: 

 

Tín hiu clicked() ca đi ng nút nhn đưc phát ra kết hp vi phương thc onButtonClick(). Mc đích khi nhn vào button s đi văn bn “Click me” sang “Button clicked!" 

2. Event handler: 

  • Event các hành đng c th xy ra trong ng dng ( d: nhn phím, di chuyn chut) đưc x trc tiếp bi các event handler trong widget. 

  • Các phương thc ph biến: 

    • mousePressEvent: X s kin nhn chut. 

    • keyPressEvent: X s kin nhn phím. 

    • closeEvent: X s kin đóng ca s. 

    • resizeEvent: X s kin thay đi kích thưc ca s. 

    • d s dng event handler:

    • from PyQt6.QtWidgets import QApplication, QWidget 

      from PyQt6.QtCore import Qt 

       

      class MyApp(QWidget): 

         def __init__(self): 

             super().__init__() 

             self.initUI() 

       

         def initUI(self): 

             self.setGeometry(300, 300, 300, 200) 

             self.setWindowTitle('Event Handling Example') 

             self.show() 

       

         def keyPressEvent(self, event): 

             if event.key() == Qt.Key.Key_Escape: 

                 self.close()  # Đóng ca s khi nhn phím Escape 

       

      if __name__ == '__main__': 

         app = QApplication([]) 

         ex = MyApp() 

         app.exec() 

       

      Gii thích: trong s kin keyPressEvent kim tra nếu phím Esc đưc nhn s đóng ca s. 

    • Signal - Slot 

       

      • ten_doi_tuong: Object name ca các thành phn giao din ( th đt tên trc tiếp trong Qt Designer) 

      • signal: các tín hiu đưc phát ra t widget 

      • connect(): hàm kết ni signal vi slot 

      • mySlot: phương thc viết ra đ phn hi tương tác ca ngưi dùng. 

      2. Event Handler 

      class MyApp(QWidget): 

         def __init__(self): 

             super().__init__() 

       

         def mousePressEvent(self, event): 

    • # Code thc hin khi nhn chut 

             print("Mouse clicked!") 

       

         def keyPressEvent(self, event): 

             # Code thc hin khi nhn phím 

             print(f"Key pressed: {event.text()}") 

       

         def resizeEvent(self, event): 

             # Code thc hin khi thay đi kích thưc ca s 

             print(f"Window resized to: {self.width()} x {self.height()}") 

       

      • Event đưc viết dng phương thc bên trong lp, 2 đi s self event, event mt đi ng đi din cho s kin đang xy ra trong ng dng, cha thông tin cn thiết đ x s kin đó. Mi loi s kin (chut, phím, thay đi kích thưc) mt lp s kin tương ng vi các thuc tính phương thc c th đ truy cp thông tin liên quan.

      • Ca s thông báo trong PyQt ca s xut hin đ xác nhn hoc thông báo li, tin nhn đến ngưi dùng. mt s nút tiêu chun, chng hn như nút OK, nút Yes nút No. 

        Thc hành khi to ca s hi thoi: 

        Thư vin PyQt cung cp lp QMessageBox đ to hp thoi như sau: 

        import sys 

        from PyQt6.QtWidgets import QApplication, QMessageBox 

         

        app = QApplication(sys.argv) 

        msg_box = QMessageBox() 

        msg_box.setWindowTitle("Li") 

        msg_box.setIcon(QMessageBox.Icon.Warning) 

        msg_box.setText("Vui lòng nhp email hoc s đin thoi!") 

        msg_box.setStyleSheet("background-color: #F8F2EC; color: #356a9c") 

        sys.exit(msg_box.exec()) 

         

        Gii thích: 

        • QMessageBox() đ khi to đi ng hp thoi. 

        • setWindowTitle: thuc tính hin th tên ca ca s 

        • setIcon: cài đt thuc tính to icon hin th kèm hp thoi. các icon lp QMessageBox cung cp như sau 

        • QMessageBox.Icon.Warning:

          • QMessageBox.Icon.Question:  

          • QMessageBox.Icon.Information:  

          • QMessageBox.Icon.Critical:  

          • setText: cài đt thuc tính hin th thông báo/tin nhn lên ca s  

          • setStyleSheet: cài đt thuc tính style (làm đp) cho ca s, bao gm nhiu cp thuc tính, mi cp thuc tính cách nhau du chm phy. 

          • msg_box.exec(): phương thc thc thi vòng lp hin th msg_box, vòng lp này s tn ti xuyên sut chương trình đến khi ca s b đóng. 


        Giải code:

      • Giải thích đoạn mã:

        1. Thư viện và import:

          • from PyQt6.QtCore import Qt: Import các module cần thiết từ PyQt6 để xử lý sự kiện.
          • from PyQt6.QtWidgets import QApplication, QMainWindow, QMessageBox, QWidget: Import các lớp cần thiết cho giao diện ứng dụng.
          • from PyQt6 import uic: Dùng để tải file .ui (tạo từ Qt Designer) vào mã Python.
          • import sys: Import module sys để có thể thoát ứng dụng một cách an toàn.
        2. Lớp Login:

          • Là một lớp kế thừa từ QMainWindow, biểu diễn cửa sổ đăng nhập.
          • Hàm __init__() khởi tạo và tải giao diện từ file login.ui.
          • self.btnRegister.clicked.connect(self.show_register): Kết nối nút "Đăng ký" với phương thức show_register.
          • self.btnLogin.clicked.connect(self.check_login): Kết nối nút "Đăng nhập" với phương thức check_login.
          • check_login(): Kiểm tra thông tin đăng nhập:
            • Lấy dữ liệu từ các trường nhập liệu txtEmailtxtPassword.
            • Nếu thông tin đúng (email là "admin@example.com" và mật khẩu là "admin"):
              • Hiển thị cửa sổ chính (main.show()) và đóng cửa sổ đăng nhập (self.close()).
            • Nếu thông tin sai:
              • Hiển thị hộp thoại thông báo lỗi với nội dung "Vui lòng nhập kiểm tra lại thông tin đăng nhập".
          • show_register(): Mở cửa sổ đăng ký và đóng cửa sổ đăng nhập hiện tại.
        3. Lớp Register:

          • Biểu diễn cửa sổ đăng ký, kế thừa từ QMainWindow.
          • Tương tự như lớp Login, nhưng phương thức show_login() sẽ mở lại cửa sổ đăng nhập và đóng cửa sổ đăng ký hiện tại.
        4. Lớp Main:

          • Biểu diễn cửa sổ chính của ứng dụng sau khi đăng nhập thành công.
          • Tải giao diện từ file main.ui.
        5. Khởi chạy ứng dụng:

          • Tạo đối tượng QApplication.
          • Tạo các đối tượng cho từng cửa sổ (Login, Register, Main).
          • Hiển thị cửa sổ đăng nhập đầu tiên (login.show()).
          • Bắt đầu vòng lặp sự kiện với app.exec().

        Phân tích theo đề bài:

        • Nút "Đăng nhập" (btnLogin): Kết nối với phương thức check_login, kiểm tra xem giá trị của trường email và password có khớp với thông tin định sẵn không. Nếu đúng, chuyển sang cửa sổ chính, nếu sai, hiện hộp thoại cảnh báo với thông báo lỗi.
        • Nút "Đăng ký" (btnRegister): Mở cửa sổ đăng ký.
        • Hộp thoại lỗi (QMessageBox): Hiển thị thông báo khi nhập thông tin sai.

        Cấu trúc này phù hợp với yêu cầu của giao diện: nếu thông tin đăng nhập sai, hiển thị một thông báo lỗi, nếu đúng, mở trang chính của ứng dụng.

Đăng nhận xét

Mới hơn Cũ hơn