Qt Model&View&Delegate(模型-视图-代理) 介绍和使用

一、Model (模型) 介绍

Qt Model 是 Qt 的一个重要组件,用于管理和展示数据。它是 Qt 的 Model/View 架构的核心部分,用于将数据模型与其视图相分离,实现数据的高效处理和可视化呈现。

Qt Model 可以理解成一组数据结构,其中包含了待展示的数据,以及有关这些数据的元数据信息,如列名、列类型、数据行数等。Qt Model 还提供了一系列接口,用于访问和操作这些数据,使得开发人员可以轻松地实现数据的增删改查等操作。

Qt Model 支持多种数据模型,包括基于内存、文件、数据库等不同类型的数据源,开发人员可以根据实际需求选择合适的数据模型。此外,Qt Model 也提供了多种视图组件,如 QListView、QTableView、QTreeView 等,用于将数据以不同的方式展示出来,同时也支持自定义视图组件。

lnterView 框架中所有模型都基于抽象基类 QAbstractltemModel 类,此类由:

  • QAbstractListModel
  • QAbstractProxyModel
  • QAbstractTableModel

类继承

二、View (视图) 介绍

Qt View 是一个跨平台的应用程序,用于在多个设备上查看 RTSP 和 HTTP 播放器。它使用Qt框架的嵌入式Web服务器和界面库,为用户提供了一个简单、易用的图形用户界面,支持实时视频流的播放、录像回放、抓拍等功能。Qt View 可以运行在多个操作系统,包括 Windows,Linux,Android 和 iOS 等。它广泛应用于监控系统、视频会议、视频门禁、家庭安防等领域。Qt View 被广泛应用于开源软件中,例如 ZoneMinder、iSpy、Bluecherry 和 Zoneminder-Moonlight。

InterView 框架中的所有视图都基于 抽象 基类 QAbstractltemView 类,此类由

  • QColumnView
  • QHeaderView
  • QListView
  • QTableView
  • QTreeView

类继承

三、Delegate (代理) 介绍

Qt Delegate是一种Qt框架中的重要组件,用于在数据模型和视图之间提供交互性。它可以用于自定义Qt控件的外观和行为,以满足特定的应用程序需求。

Qt Delegate通常用于实现以下功能:

  1. 为视图中的项目创建自定义外观,并定制数据的显示方式。

  2. 在编辑模式下,为单元格提供自定义编辑器以编辑数据。

  3. 实现特定的用户交互行为,如拖放、复制和粘贴等。

lnterView 框架中的所有代理都基于抽象基类 QAbstractltemDelegate 类

此类由

  • QltemDelegate
  • QStyledltemDelegate

类继承

开发者可以继承这些类,实现自己的Delegate类,并提供自定义的视图和编辑器。Delegate类被应用程序中的QListView、QTableView、QTreeView等视图类调用,以实现数据模型的可视化展示和编辑。

四、Model-View-Delegate(模型-视图-代理) 实操

1.QT当中model-view-delegate(模型-视图-代理),此结构实现数据和界面的分离。

Qt的模型-视图结构分为三部分:模型(mode)-视图(view)-代理(Delegate) ,其中模型与数据源通信,

并为其它部件提供接口;

视图从模型中引用数据条的模型索引(Modellndex),在视图当中,代理负责绘制数据条目,比如编辑条目,代理和模型进行直接通信。

2、模型 (model): 实现自定义模型可以通过QAbstractltemModel类继承,也可以通过QAbstractListModel和QAbstractTableModel类继承实现列表模型或者表格模型

3、视图(view): 实现自定义的视图View,可以继承子QAbstractltemView类,对所需要的虚拟函数进行重定义

4.代理 (delegate) :在表格当中嵌入各种不同的控件,通过表格中控件对编辑的内容进行操作。表格插入控件方式,控件始终显示。

案例分析:实现下图功能

代码示例:

mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};
#endif // MAINWINDOW_H

main.cpp

cpp 复制代码
#include "mainwindow.h"

#include <QApplication>

#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>

#include <QSplitter>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 将下面两条语句注释操作
    // MainWindow w;
    // w.show();

    QDirModel model; // 专门用于获取磁盘文件目录的数据模型 类似QFileSystemModel类
    QTreeView tree; // 树形视图
    QListView list; // 列表视图
    QTableView table; // 表视图

    // 设置数据模型
    tree.setModel(&model);
    list.setModel(&model);
    table.setModel(&model);

    tree.setSelectionMode(QAbstractItemView::MultiSelection);
    list.setSelectionModel(tree.selectionModel());
    list.setSelectionModel(tree.selectionModel());


    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,SLOT(setRootIndex(QModelIndex)));
    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,SLOT(setRootIndex(QModelIndex)));

    QSplitter *qsp=new QSplitter;
    qsp->addWidget(&tree);
    qsp->addWidget(&list);
    qsp->addWidget(&table);

    qsp->show();

    qsp->setWindowTitle("模型(Model)--测试操作");


    return a.exec();
}

mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}

MainWindow::~MainWindow()
{
}
相关推荐
过过过呀Glik36 分钟前
在 Ubuntu 上安装 Muduo 网络库的详细指南
linux·c++·ubuntu·boost·muduo
蜀黍@猿1 小时前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧4091 小时前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
zh路西法2 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
轩辰~2 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
蜀黍@猿2 小时前
C/C++基础错题归纳
c++
雨中rain3 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
ALISHENGYA4 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
arong_xu4 小时前
现代C++锁介绍
c++·多线程·mutex