" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt中MVD模式的具體使用

 更新時間:2026年03月26日 09:31:45   作者:尋找華年的錦瑟  
本文主要介紹了Qt中MVD模式的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、前言

  MVD 模式的核心價值:關注點分離,讓數(shù)據(jù)管理、顯示邏輯和用戶交互各自獨立,從而創(chuàng)建出更可維護、可擴展的應用程序。

Model: 完全不知道數(shù)據(jù)會如何顯示,只負責存儲和管理數(shù)據(jù)。

View :視圖作為橋梁,從 Model 獲取數(shù)據(jù)、將數(shù)據(jù)傳遞給 Delegate 進行渲染、處理用戶交互事件

Delegate :委托完全控制每個項目的外觀,包括顏色、布局、邊框等。

好處:

修改方便:

  • 可以輕松更換不同的 Model 來改變數(shù)據(jù)源
  • 可以輕松更換不同的 View 來改變交互方式
  • 可以輕松更換不同的 Delegate 來改變外觀

 松耦合設計

  • 修改數(shù)據(jù)不影響顯示邏輯
  • 修改顯示樣式不影響數(shù)據(jù)
  • 各部分可以獨立開發(fā)和測試

二、Model

 基礎模型類型:

QStringListModel - 字符串列表模型

#include <QStringListModel>

QStringListModel *model = new QStringListModel;
model->setStringList({"蘋果", "香蕉", "橙子"});

QStandardItemModel - 標準項目模型

#include <QStandardItemModel>

QStandardItemModel *model = new QStandardItemModel;
model->appendRow(new QStandardItem("項目1"));

QFileSystemModel - 文件系統(tǒng)模型

#include <QFileSystemModel>

QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::homePath());

三、View

  • QListView:將數(shù)據(jù)項顯示為列表。
  • QTableView:將數(shù)據(jù)項顯示在表格中。
  • QTreeView:將數(shù)據(jù)項顯示在層次結構的樹中。
  • QColumnView:使用多個列顯示數(shù)據(jù)項,每個列代表一個層次級別。
  • QHeaderView:用于顯示表格或列表的標題行或標題列,通常不單獨使用,而是作為QTableView和QTreeView的一部分。
  • QListWidget、QTableWidget、QTreeWidget:這些是方便類,內部已經集成了模型,適用于簡單應用。但它們不符合嚴格的MVC模式,因為模型和視圖是捆綁在一起的。

四、delegate

常用的委托方式:

  • 使用內置委托:QT提供了一些內置的委托類,如QStyledItemDelegateQItemDelegate。通常推薦使用QStyledItemDelegate,因為它使用當前樣式來繪制項目。 內置委托:
  • QT的內置委托可以處理大多數(shù)常見的數(shù)據(jù)類型(如字符串、數(shù)字、日期等)的顯示和編輯。例如,當你在一個模型/視圖結構中編輯一個布爾值時,內置委托會提供一個復選框;編輯數(shù)字時,會提供一個數(shù)字輸入框等。
  • 自定義委托:通過繼承QStyledItemDelegateQItemDelegate,并重寫其虛函數(shù)來實現(xiàn)自定義的顯示和編輯行為。
  •  自定義委托:自定義委托通常需要重寫以下一個或多個函數(shù):
    • paint(): 用于自定義項目的顯示。
    • sizeHint(): 返回項目的大小。
    • createEditor(): 返回一個用于編輯項目的部件(如QLineEdit、QComboBox等)。
    • setEditorData(): 將模型中的數(shù)據(jù)設置到編輯器。
    • setModelData(): 將編輯器中的數(shù)據(jù)保存到模型。
    • updateEditorGeometry(): 設置編輯器在視圖中的位置和大小。

五、案例

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QListView>
#include <QStringListModel>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QVBoxLayout>
#include <QWidget>
// 前向聲明
class QListView;
class QStringListModel;
class SimpleDelegate;
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private:
    void setupUI();
    void setupModel();
    QListView *listView;
    QStringListModel *model;
    SimpleDelegate *delegate;
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QListView>
#include <QStringListModel>
#include <QStyledItemDelegate>
#include <QPainter>
#include <QVBoxLayout>
#include <QWidget>
class SimpleDelegate : public QStyledItemDelegate
{
public:
    explicit SimpleDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 繪制背景
        if (option.state & QStyle::State_Selected) {
            painter->fillRect(option.rect, QColor(173, 216, 230)); // 淺藍色選中背景
        } else {
            painter->fillRect(option.rect, Qt::white); // 白色默認背景
        }
        // 繪制文本
        QString text = index.data(Qt::DisplayRole).toString();
        painter->setPen(Qt::black);
        painter->drawText(option.rect, Qt::AlignCenter, text);
        // 繪制邊框
        painter->setPen(Qt::lightGray);
        painter->drawRect(option.rect.adjusted(0, 0, -1, -1));
    }
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 設置項目大小
        QSize size = QStyledItemDelegate::sizeHint(option, index);
        size.setHeight(40); // 固定高度
        return size;
    }
};
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , listView(new QListView(this))
    , model(new QStringListModel(this))
    , delegate(new SimpleDelegate(this))
{
     ui->setupUi(this);
    setupUI();
    setupModel();
    setWindowTitle("QT6 MVD 簡單示例");
    resize(300, 300);
}
void MainWindow::setupUI()
{
    // 創(chuàng)建中央部件
    QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);
    // 設置列表視圖屬性
    listView->setModel(model);
    listView->setItemDelegate(delegate);
    listView->setAlternatingRowColors(true); // 交替行顏色
    // 創(chuàng)建布局
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    layout->addWidget(listView);
}
void MainWindow::setupModel()
{
    // 創(chuàng)建示例數(shù)據(jù)
    QStringList data;
    data << "任務1: 學習 QT6"
         << "任務2: 理解 MVD 模式"
         << "任務3: 編寫示例代碼"
         << "任務4: 測試應用程序"
         << "任務5: 優(yōu)化界面效果";
    // 設置模型數(shù)據(jù)
    model->setStringList(data);
}
MainWindow::~MainWindow()
{
    delete ui;
}

結果:

功能演示:

我可一只修改delegate中的 painter->fillRect(option.rect, Qt::white); // 白色默認背景將背景變?yōu)閞ed;

到此這篇關于Qt中MVD模式的具體使用的文章就介紹到這了,更多相關Qt MVD模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言實現(xiàn)wave波形

    C語言實現(xiàn)wave波形

    本文詳細講解了C語言實現(xiàn)wave波形的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • 關于C語言 文件讀寫 feof 函數(shù)

    關于C語言 文件讀寫 feof 函數(shù)

    這篇文章主要給大家分享的是關于C語言文件讀寫 feof 函數(shù) ,feof 是 C 語言標準庫函數(shù),其功能是檢測文件結束符,如果文件結束,則返回非 0 值,否則返回 0,感興趣的小伙伴請跟小編一起來看看下面文章的內容吧
    2021-10-10
  • MFC實現(xiàn)漂亮界面之美化按鈕

    MFC實現(xiàn)漂亮界面之美化按鈕

    這篇文章主要為大家詳細介紹了MFC實現(xiàn)漂亮界面之美化按鈕,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Qt使用QPainter實現(xiàn)自定義圓形進度條

    Qt使用QPainter實現(xiàn)自定義圓形進度條

    這篇文章主要介紹了Qt如何使用QPainter實現(xiàn)自定義圓形進度條功能,文中的示例代碼講解詳細,對我們學習Qt有一定的幫助,需要的可以參考一下
    2022-06-06
  • C++動態(tài)內存分配超詳細講解

    C++動態(tài)內存分配超詳細講解

    給數(shù)組分配多大的空間?你是否和初學C時的我一樣,有過這樣的疑問。這一期就來聊一聊動態(tài)內存的分配,讀完這篇文章,你可能對內存的分配有一個更好的理解
    2022-08-08
  • 新手向超詳細的C語言實現(xiàn)動態(tài)順序表

    新手向超詳細的C語言實現(xiàn)動態(tài)順序表

    本文主要介紹了C語言實現(xiàn)動態(tài)順序表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 利用Matlab實現(xiàn)陰影柱狀圖的繪制

    利用Matlab實現(xiàn)陰影柱狀圖的繪制

    陰影柱狀圖繪制的代碼MATHWORKS上也有,不過是生成圖片后,識別圖像上不同顏色塊并直接修改像素生成陰影線。這樣的生成方式不可逆且自由度較低,所以本文為大家?guī)淼氖且粋€直接畫線條填充的硬畫版本,希望有所幫助
    2022-09-09
  • C++詳細講解模擬實現(xiàn)位圖和布隆過濾器的方法

    C++詳細講解模擬實現(xiàn)位圖和布隆過濾器的方法

    位圖(bitset)是一種常用的數(shù)據(jù)結構,常用在給一個很大范圍的數(shù),判斷其中的一個數(shù)是不是在其中。在索引、數(shù)據(jù)壓縮方面有很大的應用。布隆過濾器是由布隆提出的,它實際上是一個很長的二進制向量和一系列隨機映射函數(shù)。布隆過濾器可以用于檢索一個元素是否在一個集合中
    2022-06-06
  • C++實現(xiàn)LeetCode(137.單獨的數(shù)字之二)

    C++實現(xiàn)LeetCode(137.單獨的數(shù)字之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(137.單獨的數(shù)字之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言的模板與泛型編程你了解嗎

    C語言的模板與泛型編程你了解嗎

    這篇文章主要為大家詳細介紹了C語言的模板與泛型編程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

广东省| 任丘市| 阿鲁科尔沁旗| 远安县| 湾仔区| 南江县| 深圳市| 巨鹿县| 宝兴县| 西安市| 奇台县| 兴和县| 临汾市| 石屏县| 溧阳市| 娄烦县| 平原县| 北碚区| 怀宁县| 永年县| 泰来县| 娄底市| 江孜县| 报价| 都江堰市| 南阳市| 新疆| 会昌县| 洪江市| 金川县| 漳州市| 河北省| 上杭县| 科技| 夏津县| 望奎县| 沅陵县| 赣榆县| 张家川| 繁峙县| 五寨县|