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

简介: 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),在视图当中,代理负责绘制数据条目,比如编辑条目,代理和模型进行直接通信。

31a4d537524933f7c81510ec377f540c_d2beb749612743cea881a854e0a6d71f.png

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



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



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


案例分析:实现下图功能

代码示例:

mainwindow.h

#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

#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

#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}
 
MainWindow::~MainWindow()
{
}
 
相关文章
|
8天前
|
存储
QT图形视图框架绘制曲线图和Smith图
QT图形视图框架绘制曲线图和Smith图
31 0
|
8天前
|
索引
Qt的复杂代理使用总结
Qt的复杂代理使用总结
43 0
|
8天前
|
搜索推荐 C++ 索引
C++ Qt开发:QItemDelegate自定义代理组件
在Qt中,`QStyledItemDelegate` 类是用于创建自定义表格视图(如`QTableView`和`QTableWidget`)的委托类,允许你自定义表格中每个单元格的外观和交互。`QStyledItemDelegate` 是`QItemDelegate` 的子类,提供了更现代、更易用的接口。此处我们将实现对`QTableView`表格组件的自定义代理功能,例如默认情况下表格中的缺省代理就是一个编辑框,我们只能够在编辑框内输入数据,而有时我们想选择数据而不是输入,此时就需要重写编辑框实现选择的效果,代理组件常用于个性化定制表格中的字段类型。
41 0
C++ Qt开发:QItemDelegate自定义代理组件
|
8天前
|
数据库 开发者 Windows
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-2
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解
|
8天前
|
XML 设计模式 JSON
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解-1
QT 项目视图(QListView&QTreeView&QTableView)和项目部件(QListWidget&QTreeWidget&QTableWidget)详解
|
8天前
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
Qt表格中的自定义编辑组件---------------自定义代理QStyledItemDelegate
32 5
|
8天前
|
存储 数据可视化 测试技术
[Qt5] QGraphics图形视图框架概述(Item、Scene和View)
[Qt5] QGraphics图形视图框架概述(Item、Scene和View)
207 0
|
8天前
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
64 0
|
7月前
嵌入式 QT QListWidget 显示列表视图的小部件类
嵌入式 QT QListWidget 显示列表视图的小部件类
嵌入式 QT QListWidget 显示列表视图的小部件类
|
9月前
QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 终篇
接上一篇,我们需要继续完成以下的效果; 先上个效果图:
103 0