首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建基于QVariant的泛型模型?

创建基于QVariant的泛型模型可以通过以下步骤实现:

  1. 导入必要的头文件:
代码语言:txt
复制
#include <QAbstractItemModel>
#include <QVariant>
#include <QList>
  1. 定义泛型数据项类:
代码语言:txt
复制
class GenericItem
{
public:
    GenericItem(const QVariant& data, GenericItem* parent = nullptr);
    ~GenericItem();

    void appendChild(GenericItem* child);
    GenericItem* child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    GenericItem* parent();

private:
    QList<GenericItem*> m_children;
    QVariant m_itemData;
    GenericItem* m_parent;
};
  1. 实现泛型数据项类的成员函数:
代码语言:txt
复制
GenericItem::GenericItem(const QVariant& data, GenericItem* parent)
    : m_itemData(data), m_parent(parent)
{
}

GenericItem::~GenericItem()
{
    qDeleteAll(m_children);
}

void GenericItem::appendChild(GenericItem* child)
{
    m_children.append(child);
}

GenericItem* GenericItem::child(int row)
{
    return m_children.value(row);
}

int GenericItem::childCount() const
{
    return m_children.count();
}

int GenericItem::columnCount() const
{
    return 1; // 只有一列数据
}

QVariant GenericItem::data(int column) const
{
    if (column == 0)
        return m_itemData;

    return QVariant();
}

int GenericItem::row() const
{
    if (m_parent)
        return m_parent->m_children.indexOf(const_cast<GenericItem*>(this));

    return 0;
}

GenericItem* GenericItem::parent()
{
    return m_parent;
}
  1. 创建泛型模型类:
代码语言:txt
复制
class GenericModel : public QAbstractItemModel
{
public:
    GenericModel(QObject* parent = nullptr);
    ~GenericModel();

    QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
    QModelIndex parent(const QModelIndex& index) const override;
    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;

private:
    GenericItem* m_rootItem;
};
  1. 实现泛型模型类的成员函数:
代码语言:txt
复制
GenericModel::GenericModel(QObject* parent)
    : QAbstractItemModel(parent), m_rootItem(nullptr)
{
}

GenericModel::~GenericModel()
{
    delete m_rootItem;
}

QModelIndex GenericModel::index(int row, int column, const QModelIndex& parent) const
{
    if (!hasIndex(row, column, parent))
        return QModelIndex();

    GenericItem* parentItem;

    if (!parent.isValid())
        parentItem = m_rootItem;
    else
        parentItem = static_cast<GenericItem*>(parent.internalPointer());

    GenericItem* childItem = parentItem->child(row);
    if (childItem)
        return createIndex(row, column, childItem);
    else
        return QModelIndex();
}

QModelIndex GenericModel::parent(const QModelIndex& index) const
{
    if (!index.isValid())
        return QModelIndex();

    GenericItem* childItem = static_cast<GenericItem*>(index.internalPointer());
    GenericItem* parentItem = childItem->parent();

    if (parentItem == m_rootItem)
        return QModelIndex();

    return createIndex(parentItem->row(), 0, parentItem);
}

int GenericModel::rowCount(const QModelIndex& parent) const
{
    if (parent.column() > 0)
        return 0;

    GenericItem* parentItem;
    if (!parent.isValid())
        parentItem = m_rootItem;
    else
        parentItem = static_cast<GenericItem*>(parent.internalPointer());

    return parentItem->childCount();
}

int GenericModel::columnCount(const QModelIndex& parent) const
{
    if (parent.isValid())
        return static_cast<GenericItem*>(parent.internalPointer())->columnCount();
    else
        return 1; // 只有一列数据
}

QVariant GenericModel::data(const QModelIndex& index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role != Qt::DisplayRole)
        return QVariant();

    GenericItem* item = static_cast<GenericItem*>(index.internalPointer());

    return item->data(index.column());
}
  1. 在使用泛型模型的地方创建模型实例并设置数据:
代码语言:txt
复制
GenericModel* model = new GenericModel(this);
GenericItem* rootItem = new GenericItem("Root Item");
model->setRootItem(rootItem);

GenericItem* childItem1 = new GenericItem("Child Item 1", rootItem);
rootItem->appendChild(childItem1);

GenericItem* childItem2 = new GenericItem("Child Item 2", rootItem);
rootItem->appendChild(childItem2);

通过以上步骤,你可以创建一个基于QVariant的泛型模型,并在模型中存储和展示各种类型的数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

当类相关时,如何在两个类之间创建类似子类型关系呢

Integer(10)); // OK someMethod(new Double(10.1)); // OK 当然也是如此,在执行类型调用时,将Number作为其类型参数传递,如果参数是...那么问题来了,当类相关时,如何在两个类之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类对象是如何实现子类型化吧。...小结:可以通过继承类或者实现接口来对其进行子类型化。 搞懂了子类型化问题,我们回到“如何在两个类之间创建类似子类型关系“问题。...类或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建类或接口之间关系。

2.8K20

Java Generic 自定义如何自定义自定义边界共变性,逆变性对象比较

如何自定义 考虑我们要实现了一个节点对象,这个对象可以自定义类型,我们可以用语法进行如下定义: package Generic; public class Node { private...; E next(); void remove(); } 自定义边界 在定义时候,可以定义边界,例如下面的例子 class Animal {} class Human...Java亦不支援逆變性,不過可以使用態通配字元?...,因為Java所採用態抹除,也就是說,程式中語法 態指定,僅提供編譯器使用,執行時期無法獲態資訊,因而instanceof在執行時期比對時,僅能針對Basket態比對,無法針對當中實...: 在程序中对Basket类型判断是不合法,因为java采用是类型擦除,也就是说,在程序中语法类型指定,仅给编译器使用,执行时无法获取类型信息,因而instanceOf在执行器对比时

1.1K10

Go缺陷?,Go Stream是如何解决Go不支持方法问题

大家好,我是Coder哥,最近在用Go语言写项目,也在用解决一些问题,但是也发现了一些问题,今天我们就来聊聊Go语言中型函数和方法边界在哪?...,于是就有了Go-Stream 这个项目,在写Go Stream和用时候发现了一个关于Golang一个很有意思问题,借此我们来聊一下Go语言方法边界在哪。...咱还是循序渐进展开分析: go-stream框架简介 发现问题过程。 Go为什么不支持方法? go-stream框架是怎么解决这个问题。...因为官方明确说明,目前Go语言不支持方法 如果支持方法,按找目前编译机制,可能需要修改编译器而且会比较复杂 为什么Go不好实现方法?...如果规定方法不能实现接口呢?那么这类方法存在意义是什么呢? 所以目前没有太好手段去实现方法,暂时搁置了。 期待后面的版本加上。

15400

和元编程模型:Java, Go, Rust, Swift, D等

在本文中,我将带你领略不同语言中系统以及它们是如何实现。...我将从C这样不具备系统语言如何解决这个问题开始,然后分别展示其他语言如何在不同方向上逐渐添加扩展,从而发展出各具特色系统。...概述 下图包含了本文讨论所有语言系统,用以概述本文主要内容以及它们是如何结合在一起。 ?...C(void*)、Go(interface{})、无Java(Object)、无Objective-C(id) 基于类型擦除装箱 这里有一些基础装箱问题。...Java和Objective-C一开始都是使用基础装箱,后来又增加了基于类型擦除功能,为了兼容,甚至使用了和以前完全一样集合类型,但可以选择参数。

3K30

Go每日一库之133:lo(基于 Golang lodash 库)

Go 1.18 包含大量新功能:模糊测试、性能改进、工作区等,以及 Go 语言开源以来最大一次语法特性变更 —— 支持!...支持后,我们便不再需要写如下冗余代码: 现在只需要简单一行即可: func Min[T constraints.Ordered](a, b T) T { if a < b { return.... _.filter(users, { 'age': 36, 'active': true }); // => objects for ['barney'] somber/lo 在 Golang 支持之前...go-funk 和robpike/filter都是通过该种方式实现工具库。 somber/lo 是一个基于 Golang 实现 lodash 风格工具库,比较好避免了上面的问题。...: 小结 somber/lo 基于包装了非常多工具方法,可以大大节省我们开发时间,避免重复开发,提升效率。

62260

【Rust日报】 2019-07-24:不同语言中和元编程模型

async_trait::async_trait; #[async_trait] trait Advertisement { async fn run(&self); } async-trait 不同语言中和元编程模型...#Metaprogramming #Generics 该文作者比较了Go、Rust、Swift和D等语言中,以及阐述了这些语言中如何实现。...本文作者不是一名程序员,他从去年开始想要创建一个自己个人棒球数据基础设施,所以想自学一门编程语言,后来选择了Rust。...这之前他也了解过R/ Python,来看看他写两篇文章,看看他如何理解Rust,以及他如何通过类比棒球比赛(代码示例)来理解Rust所有权。...Read More 这篇issues比较详细解释了跨语言LTO 「用Rust写前端系列文章」如何模块化你Rust前端 #yew 该文教你用Yew函数和组件来模块化代码。 Read More

1K30

如何构建基于模型App

不论是AI 原生还是AI 赋能应用,都会面临如何构建基于模型APP 问题,基于模型App 在系统架构和开发方式上有什么不同呢? 1....这也允许大模型在广泛任务中进行化,然后下游进行微调。 在构建基于模型App时,很容易将这些LLM简单地用作知识/事实源(即搜索引擎)。实际上,我们应该利用LLM强大语言理解和处理能力。...基于模型 API 简单应用构建所面临问题 构建大模型App 最直接方式是在LLM API上创建一个简单应用程序层,可以将LLM与应用程序用例、数据和用户会话联系起来,可用于维护与用户先前交互记忆和状态...3.4 记忆数据向量存储 记忆数据向量存储类似于上下文数据向量存储,但是,它由先前使用应用程序生成LLM提示和响应键值对进行填充。...构建大模型App 简单示例 构建一个基于模型app,大概可以采用以下步骤: 在待创建或已有的App中引入用户显式用自然语言进行交互入口(也可以采用隐式方式); 明确所需解决问题领域空间,加载目标领域文档内容

1.6K20

如何基于一张图片来创建3D模型?包含哪些步骤?

首先,基于一张图片(一个角度)来制作一个3D模型是不大现实。因为三维物体是立体、多维,单从一个角度去观察很难判断物体其他视角构造,制作出来模型也就一个平面化物体。...一般制作一个三维模型,用来参考图片最少要包含正、侧、顶三个视图,这样就可以制作出对称性三维模型了,比如人体建模。而对于不具有对称性物体建模,则需要更多角度参考图了。...现在市面上有一些工具,比如CapturingReality公司发布发布基于图片自动生成3D模型软件RealityCapture,你可以通过拍摄物体多维度照片导入软件来生成3D模型,省去了很多布线、...当然,利弊都是相互制衡,简化了操作,但是布线、修改上可能就很可能不是那么理想了。 我们就以最常用三维制作软件maya来简单说一下参照图片建模大致步骤。 我们就以建人头模型为例。...分别将正面和侧面导入到Maya前视图窗口和侧视图窗口 创建模型有多重方法,如画多边形、用box来修改等,基于对称性,我们用box来造型,把box左右分两等分,删掉左边部分(或者右边部分,根据个人喜好来决定

1.9K00

Deep learning基于theanokeras学习笔记(2)-模型(含各层方法)

Keras模型为Model,即广义拥有输入和输出模型 常用Model属性 model.layers:组成模型各个层 model.inputs:模型输入张量列表 model.outputs...:模型输出张量列表 常用Model方法 compile,fit,evaluate等跟sequential相似,就不介绍了 ---- 下面以代码示例方式学习模型 第一个模型:全连接网络 from...inputs) x = Dense(64, activation='relu')(x) predictions = Dense(10, activation='softmax')(x) # 下面代码创建包括输入层和三个全连接层模型...,就像层一样,当你调用模型时,不仅重用了它结构,也重用了它权重 x = Input(shape=(784,)) # 下面一行代码就调用了上面的model模型 y = model(x) #这种方式可以使你快速创建能处理序列信号模型...这个模型损失函数将由两部分组成,辅助损失函数评估仅仅基于新闻本身做出预测情况,主损失函数评估基于新闻和额外信息预测情况,即使来自主损失函数梯度发生弥散,来自辅助损失函数信息也能够训练Embeddding

89410

基于图神经网络、图谱数据收益预测模型(附代码)

结合了时间图神经网络,使模型能够结合股票间关系数据,如行业属性、上下游、股权信息等。...RELATIONAL STOCK RANKING(RSR) RSR总共包含三层,分别是基于序列数据应用序列神经网络模型Sequential Embedding Layer, 基于关系数据应用图神经网络...(LSTM输入为股价历史序列X_t) Relational Embedding Layer 这一层主要考虑股票之间关系数据,作者在模型中加入了两类关系数据: 行业属性:两个公司是否属于同一个行业或板块...参考Liheng 2017; LSTM:基于历史收盘价及5、10、20和30均线LSTM模型; RANK_LSTM:RSR中去除Relational Embedding Layer后模型;...产业链、供应链等图谱数据,日益成为大家关注数据类型,但很多机构并没有想好怎么用这类数据?传统基于量价深度学习模型,结合基于图谱类数据图神经网络,给这类数据应用指明了一条可探索道路。

2.9K30
领券