Qt: MVC结构

目的

主要是为了让自己能够更容易了解MVC框架,更能够去了解QAbstractItemView(QlistView, QTableView, QTreeView), QAbstractItemModel(QAbstractListModel, QAbstractProxyModel, QAbstractTableModel, QStandardItemModel), QAbstractItemDelegate(QItemDelegate, QStyledItemDelegate)之间联系,更能方便的去写依据数据需求能够快速显示数据内容。

MVC

MVC (Model, view , controller), 是一种较为流行的架构设计模式, 常用于设计模式达到解耦, 软件可拓展,重复利用目的一种模式方案。
Qt 中 MVC 指的是 model/view/delegate
delegate 负责协调model于view之间数据, 负责某个数据项的显示与编辑如用户输入编辑,并处理数据,.
view 则负责以某种形式显示数据(列表,树形, 表格-二维), 可以通过model获取数据.
model 则负责数据源存储组织, 与数据源直接接触.

思想图如下:

在这里插入图片描述
好处:

1、在处理较大的数据集时每个组件各司其职,不至于降低性能(自定义的mvc可以省略了item的设置, 这对于大量数据显示来说,减少了构造item时间开销)。
2、一个Model可以映射到多个View,这样可以以不同的方式查看数据同一份数据。
3、如果底层数据源的存储改变了,我们只需要处理Model就可以了。
在这里插入图片描述

举例

QListWidget QListModel QListWidgetItem

视图View: QListWIdget继承自QListView, 通过列表的形式显示item.
模型Model: QListModel继承自QAbstractListModel.是存item数据源,

QList<QListWidgetItem*>items;

QListWidgetItem也可以理解为数据,是显示在view里每一个单元item, 但是其存储在model里。但是Qt 这样所带来的其委托是默认的,

我们也可以如上面那样自定义一套自己的MVC, 显示数据。

其实我们很多时候不用再去继承QAbstractItemView, 对于视图而言, 列表, 表格(二维),树形视图,早已经满足我们大多数需求。

对于Model, 我们常常自定义Model继承自QAbstractItemModel, 对于自定义的Model, 要注意一些必须重写的虚函数, 不然容易在编译过程中出现虚函数未重写之类相关问题。也要注意如下flags, 否则显示的item可能不满足你所需要的默认是可选择可用, 但是可编辑需要自己设置。

Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable 表示可以编辑可选择等

我们在model里面数据会存储自定义的数据信息, 类似于QListModel中QListWidgetItem, 然后分别对数据进行增删改查等操作, 在操作过程中注意如下函数调用, 确保变化到每一个所依附的视图中。

beginResetModel();
endResetModel();
beginRemoveRows(QModelIndex(), row, row);
endRemoveRows();
beginInsertRows(QModelIndex(), row, row);
endInsertRows();

委托就相对来说就好多了, Qt中的委托用来显示或者编辑存储在model中的item datas. 一般如果要重写委托, 可以继承自QAbstractItemDelegate(重写的函数就老多了), QStyledItemDelegate, QItemDelegate。 Qt 一般默认继承自QStyledItemDelegate, 关于QStyledItemDelegate与QItemDelegate区别, 说法是没多大区别,除了如果你要用绘制样式去实现自定义委托需求,但Qt 主要建议才能采用QStyledItemDelegate.
QItemDelegate 需要实现的函数(基于部件的委托)

createEditor();
setEditorData();
upadteEditorGeometry();
setModelData();

如果想绘制自定义的钥匙数据类型,可能需要重写

paint();
sizeHint();

等等, 如上先暂时写到这, 后期如果有编辑修改的会继续更新。

QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)
C + + Qt:QStyledItemDelegate的createEditor从来没有被调用

参考博客

观看如上博客, 希望能对您探索MVC, 会有一定了解, 能更清楚写一个mvc架构.
博客一
博客二
博客三
博客四
QItemDelegate和 QStyledItemDelegate的区别
Qt中QAbstractTableModel、QItemDelegate的联合使用
模型、视图、委托
Qt 自定义委托

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值