快捷搜索:

Qt--自定义Model

来源:http://www.shanghai-sourcing.com 作者:金沙澳门官网55网址 人气:199 发布时间:2019-11-28
摘要:明确,Qt提供了黄金年代套Model/View框架供开辟者使用,Model用来提供数据,View则用来提供视觉层的体现。实际上那是风姿罗曼蒂克套坚决守住MVC设计方式的GUI框架,因为Qt还提供了暗中

明确,Qt提供了黄金年代套Model/View框架供开辟者使用,Model用来提供数据, View则用来提供视觉层的体现。实际上那是风姿罗曼蒂克套坚决守住MVC设计方式的GUI框架,因为Qt还提供了暗中认可的Delegate作为Controller来作为调节器。

图片 1

MVC的补益这里就相当少说了,为了开采者使用方便,Qt还提供了依据项(Item卡塔尔国的Model/View实现----QXxxWidget(QTableWidget、QListWidget等卡塔 尔(阿拉伯语:قطر‎,对于一些差十分少的应用处景,那早已足够了并且使用起来拾壹分有益。这里大家大致介绍下什么使用自定义的数据模型,来满足各样植花朵式的渴求。

1. 精选妥帖的Model世袭

1.1 标准数据模型

Qt兑现了4类标准数据模型供咱们在不一致的意况下接收:

  1. QStringListModel:存储字符串列表
  2. QStandardItemModel:存储Qt--自定义Model。树状布局的自由数据
  3. QFileSystemModel:存储本土文件系统上的文件和目录音讯
  4. QSqlQueryModel、QSqlRelationalTableModel、QSqlTableModel:存储Qt--自定义Model。关系型数据库中的数据

Qt--自定义Model。假诺采用情状和上述意况之蓬蓬勃勃相比较雷同,则能够酌量继续对应的模子类,同等对待复实现少数虚函数。

1.2 抽象数据模型

空洞数据模型有3类:

  1. QAbstractItemModel:项模型,那是有所数据模型的基类。
  2. QAbstractListModel:列表模型,结合QListView使用最合适。
  3. QAbstractTableModel:表模型,结合QTableView使用最合适。

  4. 三番两次抽象模型


Qt官方提供了周全的文档来帮衬开采者来自定义模型类。依照官方网址,子类化模型供给开辟者完毕的坚决守护(即须求再行完结的虚函数卡塔尔国按效果与利益来分能够分成三类:

  • 项数据管理:那又能够分为三类----只读访谈可编辑调度大小
  • 导航和下标创造。
  • 拖拽和MIME类型管理。

咱俩只供给遵照自身的效力须要来完成此中的部分虚函数。

3. 得以达成二个自定义模型

此地大家来落实一个自定义模型,并在QTableView中使用它,因而大家选取继续QAbstractTableModel,那样大家必要做的改造起码。但采纳QTableModel并不代表我们的数据布局就是Table状的,比如上面包车型大巴例子中大家一向无需中间数据布局。

上面大家要兑现这样一个数据模型:

  • 里头不存款和储蓄数据布局
  • 表中的每一个单元获得的数据是整型,何况值为列下标的平方
  • 模型中的数据为只读

3.1 实现CustomeModel

该模型世襲自QAbstractTableModel,作为只读模型,我们只要求达成以下几个虚函数:

virtual Qt::ItemFlags flags(const QModelIndex &index) const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
virtual int rowCount(const QModelIndex &parent) const;
virtual int columnCount(const QModelIndex &parent) const;

data()函数与项数占领关,这里数据有有个别种角色(role卡塔尔,最基本的就是Qt::DisplayRole,这里为了兑现居中效能,大家还管理了Qt::TextAlignmentRole角色:

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole) {
        return index.column() * index.column();
    }
    if (role == Qt::TextAlignmentRole) {
        return Qt::AlignCenter;
    }
    return QVariant();
}

headerData()函数提供表头数据,蕴涵八个趋向(垂直、水平卡塔尔国的表头。相符,这里的多寡也许有好二种剧中人物,大家只管理Qt::DisplayRole

QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Vertical) {
        if (role == Qt::DisplayRole)    return QVariant("row:" + QString::number(section));
        else                            return QVariant();
    }
    if (orientation == Qt::Horizontal) {
        if (role == Qt::DisplayRole)    return QVariant("column:" + QString::number(section));
        else                            return QVariant();
    }
}

rowCount()columnCount()重回数据模父下标(QModelIndex卡塔尔的行和列数量,这里我们要甄别下标是或不是行得通:因为不论什么事表模型的父下标为无效下标,我们重回表模型的行列数量;当下标有效时,大家回来的是父下标指向处的子表的行列

//  if `parent` is invalid, return the whole table row count!
//  else return the children row count of the `parent`
int MyTableModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    else
        return 10;
}

3.2 运转结果

图片 2

风度翩翩体化代码见此处。

本文由金沙澳门官网55网址发布于金沙澳门官网55网址,转载请注明出处:Qt--自定义Model

关键词:

上一篇:没有了

下一篇:毕业党求职小指南

频道精选

最火资讯