PYQT TUTORIAL
Hướng dẫn sử dụng LangChain bằng Python Cách tự viết Context Manager trong Python Cách background của hình ảnh trong Python Cách làm việc với Notion API trong Python Cách đo Time chạy trong Python Cách sao chép danh sách (List) trong Python Cách kiểm tra List trống trong Python Cách sắp xếp dictionary theo giá trị trong Python PyQt là gì? Tạo một chương trình "Hello World". Tín hiệu và Khe (Signals & Slots) trong PyQt Cách sử dụng widget PyQt QLabel Cách sử dụng widget QPushButton của PyQt Cách sử dụng widget QLineEdit trong PyQt Cách sử dụng QVBoxLayout trong PyQt Cách sử dụng QGridLayout trong PyQt Cách sử dụng QFormLayout trong PyQt Cách sử dụng lớp QCheckBox trong PyQt Cách sử dụng lớp PyQt QRadioButton Sử dụng PyQt QComboBox để tạo Widget Combobox Cách sử dụng widget PyQt QSpinBox để tạo một spin box Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider). Cách dùng PyQt QWidget để làm container chứa các widget khác. Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ Cách sử dụng lớp PyQt QMenu để tạo menu Cách dùng lớp PyQt QToolBar để tạo các widget toolbar Cách dùng lớp QDockWidget của PyQt để tạo một widget Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar Cách sử dụng lớp QListWidget trong Python Cách sử dụng lớp QTableWidget để tạo một bảng Cách sử dụng lớp QTreeWidget của PyQt Cách sử dụng Qt Designer để thiết kế UX/UI trong PyQt. Cách sử dụng QThread trong PyQt Cách tạo các lớp QThreadPool đa luồng trong PyQt Cách hoạt động của Model/View trong PyQt Cách sử dụng Qt Style Sheets (QSS) trong PyQt. Chuyển đổi PyQt sang EXE trong PyQt
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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):

Screenshot 202024 09 16 20222420 png

  • 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 controllerview 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.

Screenshot 202024 09 16 20222437 png

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 signalsslots.

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 boxlist view. Cả hai widget này đều sử dụng cùng một model, là một instance của QStringListModel:

PyQt ModelView Widget Example png

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.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top