Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách hoạt động của Model/View trong PyQt
Trong bài viết này, mình sẽ tìm hiểu mô hình Model/View trong PyQt, một kiến trúc mạnh mẽ giúp tách biệt việc xử lý dữ liệu và hiển thị giao diện. Bằng cách sử dụng mô hình này, bạn sẽ dễ dàng quản lý và cập nhật dữ liệu một cách hiệu quả, đồng thời cải thiện khả năng tái sử dụng các thành phần trong ứng dụng. Hãy cùng tìm hiểu chi tiết về cách thức hoạt động của mô hình Model/View và những lợi ích mà nó mang lại trong việc phát triển giao diện người dùng.
Giới thiệu về mô hình Model/View trong PyQt
Mô hình Model-View-Controller (MVC) là một mẫu thiết kế phần mềm được sử dụng để phát triển giao diện người dùng (UI). Mẫu này tách biệt ba phần: giao diện (views), dữ liệu (models) và logic của ứng dụng (controllers):
- Models đại diện cho dữ liệu của ứng dụng hoặc chứa logic để truy xuất dữ liệu từ cơ sở dữ liệu.
- Views chịu trách nhiệm hiển thị dữ liệu từ models qua giao diện người dùng.
- Controllers xử lý các thao tác của người dùng, làm việc với models và chọn các views để hiển thị dữ liệu.
Mục tiêu của MVC là phân tách rõ ràng giữa các phần models, views và controllers. Điều này giúp dễ dàng thêm hoặc sửa đổi giao diện mà không cần thay đổi models. MVC cũng cho phép viết các bài kiểm thử nhắm vào models và controllers mà không cần liên quan đến giao diện người dùng.
Một ưu điểm khác của MVC là một model có thể có nhiều views. Tất cả các views này đều có thể tự động cập nhật dựa trên cùng một model.
Bài viết này được đăng tại [free tuts .net]
PyQt sử dụng một biến thể của mẫu MVC bằng cách kết hợp controller và view thành một phần duy nhất gọi là view, tạo ra mô hình kiến trúc Model/View.
Kiến trúc Model/View trong PyQt giúp giảm thiểu sự phụ thuộc giữa các thành phần và tăng tính tái sử dụng.
Trong kiến trúc Model/View, view xử lý việc hiển thị dữ liệu thông qua một delegate. Delegate có hai nhiệm vụ chính:
- Hiển thị dữ liệu.
- Giao tiếp với model khi dữ liệu được chỉnh sửa.
Các models, views và delegates giao tiếp với nhau thông qua signals và slots.
PyQt cung cấp một số widgets tiêu chuẩn theo mô hình Model/View như:
- QListView – hiển thị danh sách các mục.
- QTableView – hiển thị bảng dữ liệu.
- QTreeView – hiển thị dữ liệu theo cấu trúc cây.
Ngoài các widgets này, QComboBox cũng hỗ trợ mô hình Model/View.
Bên cạnh đó, PyQt còn có các lớp model cơ bản như QAbstractListModel, QAbstractTableModel, và QStandardItemModel.
Ví dụ về mô hình Model/View trong PyQt
Mình sẽ lấy một ví dụ đơn giản để minh họa cách sử dụng mô hình Model/View trong PyQt:
import sys from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QComboBox, QListView from PyQt6.QtCore import QStringListModel class MainWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setGeometry(100, 100, 400, 200) self.setWindowTitle('PyQt Model/View') layout = QVBoxLayout() self.setLayout(layout) model = QStringListModel() model.setStringList(['Táo', 'Chuối', 'Cam']) self.list_view = QListView() self.list_view.setModel(model) self.combo_box = QComboBox() self.combo_box.setModel(model) layout.addWidget(self.combo_box) layout.addWidget(self.list_view) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
Giải thích
Trong ví dụ này, mình có hai widget là combo box và list view. Cả hai widget này đều sử dụng cùng một model, là một instance của QStringListModel:
model = QStringListModel() model.setStringList(['Táo', 'Chuối', 'Cam'])
Nếu bạn thay đổi một mục trong một widget, widget còn lại sẽ tự động cập nhật thay đổi đó. Nói cách khác, bạn không cần phải viết bất kỳ mã nào để giữ cho các widget sử dụng cùng một model được đồng bộ hóa.
-
Đầu tiên, tạo một instance của lớp QStringListModel và thiết lập danh sách chuỗi:
model = QStringListModel() model.setStringList(['Táo', 'Chuối', 'Cam'])
- Tiếp theo, tạo widget QListView và đặt model của nó là model:
self.list_view = QListView() self.list_view.setModel(model)
- Cuối cùng, tạo widget QComboBox và cũng đặt model của nó giống như của QListView:
self.combo_box = QComboBox() self.combo_box.setModel(model)
Kết bài
PyQt sử dụng mô hình Model/View để đạt được sự tách biệt rõ ràng giữa các thành phần của ứng dụng, từ đó giúp việc phát triển giao diện trở nên dễ dàng và linh hoạt hơn. Kiến trúc này không chỉ hỗ trợ quản lý dữ liệu và hiển thị một cách hiệu quả, mà còn cải thiện khả năng tái sử dụng mã lệnh. Bằng cách áp dụng mô hình Model/View, bạn có thể tối ưu hóa quá trình phát triển, dễ dàng duy trì và mở rộng ứng dụng của mình trong tương lai.