设为首页 加入收藏

TOP

【Qt6】列表模型——抽象基类(二)
2023-09-23 15:44:27 】 浏览:646
Tags:Qt6
pose
SizeHintRole = 13, // 返回该列表项希望显示的大小(宽多少,高多少) InitialSortOrderRole = 14, // 数据第一次呈现时用的排序方式(升序?降序?) // 下面五个不知道是什么鬼 // Internal UiLib roles. Start worrying whe high. DisplayPropertyRole = 27, DecorationPropertyRole = 28, ToolTipPropertyRole = 29, StatusTipPropertyRole = 30, WhatsThisPropertyRole = 31, // Reserved,保留用来给开发者自定义角色。自定义角色从这个数值开始 UserRole = 0x0100 };

重写 data 方法实现了数据的只读模式,若数据支持编辑,必须重写 setData 方法,把内容写入原始数据。

如果要实现添加、删除数据项,还要重写以下方法:

6、insertRows:在行号为 row 处连续插入 count 行数据。

virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());

7、removeRows:从行号为 row 处开始,连续删除 count 行。

virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());

8、insertColumns:从列号为 column 处起,连接插入 count 列。

virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex());

9、removeColumns:从列号为 column 处开始,连续删除 count 列。

virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex());

 ===============================================================

下面咱们做一个简单的模型练练手。该模型的原始数据是一个整数列表(QList<int>)。先实现只读功能,即需要重写 parent、index、rowCount、columnCount 和 data 方法。头文件的声明如下:

#ifndef MODELS_H
#define MODELS_H

#include <QAbstractItemModel>
#include <QObject>
#include <QList>

class MyItemModel: public QAbstractItemModel
{
    Q_OBJECT

public:
    // 下面两个是构造函数
    explicit MyItemModel(QObject* parent = nullptr);
    explicit MyItemModel(const QList<int> &list, QObject* parent = nullptr);
    
    // 返回父级
    QModelIndex parent(const QModelIndex & child) const override;
    // 返回索引
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    // 返回行数和列数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    // 获取数据
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    // 下面这两个方法用来获取或设置数据源
    QList<int> intList() const;
    void setIntList(const QList<int> &list);

private:
    QList<int> m_list;  // 私有的
};

#endif

私有字段 m_list 用于引用原始数据,可以通过构造函数的 list 参数设置,也可以通过 setIntList 方法设置。

下面代码实现构造函数,主要是初始化私有成员。

MyItemModel::MyItemModel(QObject *parent)
    : m_list(QList<int>()), QAbstractItemModel(parent)
{
}

MyItemModel::MyItemModel(const QList<int> &list, QObject *parent)
    : QAbstractItemModel(parent), m_list(list)
{
}

下面代码实现 parent 方法。由于是整数列表,数据只有一层,所以直接返回 QModelIndex() 即可。

QModelIndex MyItemModel::parent(const QModelIndex &child) const
{
    // 简单的列表不需要父子层次
    // 使用无参构造函数表示无效索引
    return QModelIndex();
}

 

接着是实现返回数据列表的行数和列数。

int MyItemModel::rowCount(const QModelIndex &parent) const
{
    // 一样的道理,不能有父级数据
    if (parent.isValid() ){
        return 0;
    }
    // 返回QList中元素个数,每个元素代表一行
    return m_list.size();
}

int MyItemModel::columnCount(const QModelIndex &parent) const
{
    if(parent.isValid())
        return 0;
    // 咱们这个模型永远只有一列
    return 1;
}

 

实现 index 方法,为数据项创建索引。

QModelIndex MyItemModel::index(int row, int column, const QModelIndex &parent) const
{
    // 因为此列表不存在爷爷/孙子/父/子关系
    // 所以如果索引是有效的,说明它不对
    // 咱们这个列表是没有父级的
    if(parent.isValid())
        return QModelIndex();       // 有效索引不是咱们想要的,返回无效索引
    // 如果索引无效,说明是顶层数据,是咱们想要的
    return createI
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2.10 PE结构:重建重定位表结构 下一篇2.12 PE结构:实现PE字节注入

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目