一、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通常用于实现以下功能:
-
为视图中的项目创建自定义外观,并定制数据的显示方式。
-
在编辑模式下,为单元格提供自定义编辑器以编辑数据。
-
实现特定的用户交互行为,如拖放、复制和粘贴等。
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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow
{Q_OBJECTpublic: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()
{
}