Xây dựng giao diện với PyQT

Widget là thành phần của giao diện mà người dùng có thể tương tác. Hầu hết các giao diện được tạo thành từ nhiều widget và được sắp xếp trên màn hình. 

Các widget cơ bản 

  • Label hiển thị văn bản, hình ảnh, icon,.. Người dùng chỉ xem không thể chỉnh sửa 

  • Line Edit cung cấp hộp thoại cho phép người dùng nhập văn bản 

  • Push Button tạo nút nhấn. 

  • Date Edit : được sử dụng để cho phép người dùng chọn hoặc nhập ngày tháng. 

  • Calendar Widgethiển thị lịch ngày tháng cho phép người dùng chọn ngày tháng cụ thể. 

  • Stacked Widget cho phép xếp chồng nhiều widget/trang lên nhau. Tại một thời điểm, chỉ hiển thị một trang duy nhất.


Thử thách: Tạo giao diện cho ứng dụng quản lý anime với các trang sau: 

  • Trang chủ (trang hiển thị mặc định) 

 

  • Trang hiển thị phim 

 

  • Trang quản phim 

  •  

    Gợi ý: 

    • Sử dụng Stacked Widget để quản 3 trang 

    • Tạo một thanh điều hướng để chuyển giữa ba trang 

    Code mẫu load giao diện (ls7_sample/main1.py) 

    import sys 

    import os 

     

    from PyQt6 import uic 

    from PyQt6.QtWidgets import QMainWindow, QApplication 

     

    class MainWindow(QMainWindow): 

        # Định nghĩa vị trí của các file ui 

        UI_LOCATION = os.path.join("ui/main_window1.ui") 

        STYLE_LOCATION = os.path.join("ui/style_main1.qss") 

        def __init__(self, parent:QApplication): 

            super(MainWindow, self).__init__() 

            self.app = parent 

     

            # Load file giao diện .ui và .qss 

            self.ui = uic.loadUi(self.UI_LOCATION, self) 

            with open(self.STYLE_LOCATION, "r") as style_file: 

                style_config = style_file.read() 

            self.setStyleSheet(style_config) 

     

            # Luôn hiển thị trang home 

            self.ui.stackedWidget.setCurrentIndex(0) 

            # Hiển thị cửa sổ ra màn hình 

            self.show() 

     

    if __name__ == "__main__": 

        app = QApplication(sys.argv) 

        window = MainWindow(app) 

     

        sys.exit(app.exec()) 


QListWidget tạo một kiểu hiển thị theo kiểu danh sách, cho phép hiển thị danh sách đối tượng, thêm và xóa các phần tử đối tượng trong danh sách đó. 

 

Tạo QListWidget 

B1. Chọn List Widget từ Widget Box 

B2. Kéo widget (đặt tên animeList) vào stackedWidget của file main_window.ui 



B3. Tạo database và thêm các anime trong database vào animeList (ls7_sample/main2.py) 

        # Hiển thị trang CRUD 

        self.ui.stackedWidget.setCurrentIndex(2) 

 

        # Tạo database 

        self.dtb = models.AnimeDatabase() 

        self.dtb.load_data() 

        # Hiển thị danh sách anime 

        anime_titles = self.dtb.get_title_list() 

        self.ui.animeList.addItems(anime_titles) 

         

        # Hiển thị cửa sổ ra màn hình 

        self.show() 

Kết quả: 


Các thao tác với QListWidget: 

  • Lấy vị trí của phần tử đang được chọn bằng phương thức currentRow(). Nếu đang không chọn phần tử nào thì phương thức trả về -1. 

curr = self.ui.listWidget.currentRow() 

  • Thêm (nhiều) phần tử vào danh sách bằng phương thức addItem()/addItems() hoặc thêm phần tử vào vị trí cụ thể insertItem() 

self.ui.listWidget.insertItem(0, "Tiger") 


  • Lấy phần tử tại vị trí cụ thể ra khỏi danh sách bằng phương thức takeItem() 

self.ui.listWidget.takeItem(3) 

  • Tìm phần tử matched_items trong danh sách bằng phương thức findItems() 

from PyQt6.QtCore import Qt 

 

matched_items = self.ui.listWidget.findItems("Dog", Qt.MatchFlag.MatchContains) 

for i in range(self.ui.listWidget.count()): 

      it = self.ui.listWidget.item(i) 

      it.setHidden(it not in matched_items) 

Lặp qua từng phần tử của listWidget bằng phương thức count() và dấu các phần tử còn lại bằng phương thức .setHidden()

Trang quản lý 

Yêu cầu 

  • Hiển thị danh sách đối tượng bằng List Widget 

  • các nút: Tìm, Thêm, Sửa, Xóa 

  • Line Edit để tìm đối tượng theo tên. 

Giao diện CRUD tham khảo:


Add/Edit Dialog 

Sử dụng để nhập mới hoặc thay đổi thông tin đối tượng khi thêm mới/cập nhật. 

Yêu cầu 

  • Sử dụng template Dialog with Buttons Bottom 

 

  • các Label LineEdit cho từng thuộc tính của đối tượng. 



Mới hơn Cũ hơn