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:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top