4.2 Qt 中的界面数据绑定

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

        本文是《用 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值