本文是《用 Qt 实现电子白板》的其中一节,建议全章阅读。
在电子白板中,一个页面(ResourcePage)包含多个资源(比如图片、文字、视频等),资源有先后顺序,决定其对于控件的展示层级关系。
我们希望对资源的管理是数据驱动的,业务层只能操作数据,也就是只能调用 ResourcePage 的方法,至于控件的创建、销毁、层级改变都是内部自动管理的。
在 Qt 中,实现数据驱动界面,有一个工具,即 QAbstractItemModel 。虽然界面管理也是要自己实现,完全可以自定义数据驱动模型,但是使用 QAbstractItemModel 可以方便地与 Qt 其他组件对接,所以我们还是决定数据、界面都对接到这个工具上。
数据模型

QAbstractItemModel 是一个相当复杂的类,它里面既支持普通的一维(List)数据,也支持描述二维(Grid)数据,还能描述树形(Tree)数据。在最复杂的场景下,它是一个以 Tree 为基础,每个 Tree 节点又是一个 Row 的数据模型。
在我们的场景中 (ResourcePage),只需要作为最简单的 List 使用,所以 Tree 只有一个根节点,根节点的 Grid 只有一列数据。
class ResourcePage : public QAbstractItemModel
{
Q_OBJECT
private:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) const override;
};
实现 QAbstractItemModel,最主要的是需要实现下面这些方法:
- rowCount,columnCount 方法
这个比较简单,rowCount 返回资源的个数,columnCount 返回固定值 1,参数 parent 表示所属的树节点,显然在这里没有作用。
int ResourcePage::rowCount(const QModelIndex &parent) const
{
(void) parent;
return resources_.size();
}
int ResourcePage::columnCount(const QModelIn
Qt实现电子白板:数据驱动的资源管理

本文详细介绍了如何使用Qt的QAbstractItemModel实现数据驱动的电子白板资源管理。通过实现QAbstractItemModel的几个关键方法,如rowCount、columnCount、index、parent和data,构建了一个简单的资源数据模型。此外,还展示了如何处理资源的增删改操作,并通过信号与槽机制将数据模型与界面控件动态绑定。同时,提到了数据角色的概念,允许为不同角色提供不同的数据。
最低0.47元/天 解锁文章
1357

被折叠的 条评论
为什么被折叠?



