包含 QML 中的对象的 QAbstractListModel 有哪些缺点?

2023-12-01

Qt 提供了将 C++ 模型与 QML 相结合的可能性并在文档中建议了三种方法:

  • QStringList
  • QObjectList
  • QAbstractItemModel

前两者使用起来非常简单,例如QObjectList:

// in C++
QList<QObject*> dataList;
dataList.append(new DataObject("Item 1", "red"));

// in QML
ListView {
    model: dataList
    delegate: Text { text: name }
}

但它们都有一个强烈的警告:

注意:视图无法知道a的内容 QList 已更改。如果QList发生变化,需要重置 模型 [...]

QAbstractItemModel很难与对象一起使用,因为对象属性不直接公开,因此保持它们同步需要相当多的努力。

但是,可以将一个QList in a QAbstractItemModel并得到一个超级简单的模型。看这里:实施1, 实施2


Qt 没有原生实现这个有什么原因吗?表现?内存管理问题?这似乎是一个明显的好主意ObjectModel他们已经实现了类似的东西。


使用的一个突出缺点QObject作为模型项是因为基类非常大,它是一种“上帝对象”(这是一种反模式),包含很多大多数时候你并不真正需要的东西。因此,除了您可能拥有的任何模型数据之外,它还有大约 160 字节的“开销”。如果您有一个包含大量物品的大模型,并且物品本身相对较小,这可能会出现问题。你最终会承担很多开销。

A QObjectList作为一个模型总是一个坏主意,除非你正在做一些完全微不足道的事情。由于它没有实现适当的接口来通知引用视图的更改,唯一的方法是强制更新,这将每次重新绘制整个模型而不仅仅是更改。

对于项目对象是什么没有要求,只要正确实现模型即可。

第二种实现特别有用,原因如下:

  • 您无需为每个使用场景实施具有固定角色的特定“静态”模型
  • 您的模型项可以具有根本不同的属性,您不限于模型“架构”
  • 因为您正在处理,所以您会自动收到 QML 中的绑定通知QObject and Q_PROPERTY
  • 您可以以声明式方式定义模型,甚至可以嵌套模型来创建树结构,这是您无法做到的ListModel.
  • 您可以在纯 QML 中定义实际的模型项,而无需一直重新编译,即快速原型设计,完成后,您可以简单地将对象移植到 C++
  • 同时,除了所有优点之外,该模型实际上比常规“刚性”模型更容易实现和维护,角色查找速度更快,因为您本质上只有一个object角色并且无需任何查找,无需为角色实现数据更改信号等等...简单
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包含 QML 中的对象的 QAbstractListModel 有哪些缺点? 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c

随机推荐

  • JQuery - Firefox 中的 $.ajax ContentType 问题

    我正在使用以下代码发出跨域 JSON 请求 ajax type POST crossDomain true contentType application json charset utf 8 data domain domain asse
  • 带视图的叠加选项卡栏

    我有一个UIViewController标签栏内 对于选项卡栏中的一个 VC 我允许界面随着设备旋转而旋转 挑战是 我想隐藏选项卡栏并调整内部视图的大小 我做了什么 1 被调用 void willAnimateRotation 在我的标签栏
  • 比 for 循环更有效的求和方法

    我有两个大小相同的列表 两者都包含数字 第一个列表是生成的 第二个列表是静态的 由于我有许多生成的列表 我想找出哪一个是最好的 对我来说 最好的列表是最等于参考的列表 因此我计算每个位置的差异并将其相加 这是代码
  • 在php上写入文件

    我想保留访问者的 IP 并将其保存在文件中 我尝试了 fwrite 函数 但我认为它是在文件上的先前 ip 上重写的 Example ip txt 为空 当我运行 write php 脚本时 在 ip txt 上我有 x x x x ip
  • 将 StackPanel.Visibility 绑定到其子级的 Visibility 属性

    我对数据绑定比较陌生 只是在阅读它 我想做的是 我有一个带有许多子控件的 StackPanel
  • 从模板函数返回 double 或complex

    我正在编写一些函数模板来重载 矩阵类的运算符 我对类型矩阵做了很多工作double and complex
  • 如何在 RStudio 中查看、打开和保存 .rdb 文件

    我可以按照指示将变量环境中 rdb 文件中的每个数据库视为 承诺 here 现在 我想编辑其中一个文件并保存它 我怎样才能做到这一点 我是 R 新手 在一次讨论中r pkg 开发 Ivan Krylov 提供了以下读取 RDB 数据库的函数
  • Powershell 将用户添加到组

    我正在尝试读取包含用户信息的 XML 文件 并根据该信息将用户添加到 Active Directory 组 到目前为止 我一直在查找错误消息 但没有任何帮助 这是将用户添加到组的代码 MyUsers xml Get Content e sa
  • 没有“static”或“extern”的“inline”在 C99 中有用吗?

    当我尝试构建这段代码时 inline void f int main f 使用命令行 gcc std c99 o a a c 我收到链接器错误 未定义的引用f 如果我使用 错误就会消失static inline or extern inli
  • 解决BaseGameActivity

    我试图追随的人一样多本教程没有成功 简单的错误是 The import com google example games basegameutils BaseGameActivity cannot be resolved BaseGameU
  • 如何制作 boost::filesystem::directory_iterator 的副本?

    我知道这听起来很愚蠢 但是看看这个简单的例子 工作目录应该有多个项目 define BOOST FILESYSTEM VERSION 3 include
  • 在 Scrapy 蜘蛛中动态添加 allowed_domains

    我有一个蜘蛛 它以一小部分列表开头allowed domains在蜘蛛爬行的开始 当蜘蛛抓取从解析器内继续时 我需要动态地将更多域添加到此白名单中 但由于后续请求仍在过滤中 因此以下代码段无法完成此操作 还有更新的吗allowed doma
  • 如何从引用网址获取 location.hashtag - Google Analytics

    有一个网站在其网址中使用页面按钮和主题标签 来操纵其内容 链接 的排序方式 他们链接到我的网站 我想知道人们在最终找到我的网站并点击之前点击了哪些按钮 例如 引用网址如下所示 http www example com page1 conte
  • 使用 JQuery 查找并计算选中框的数量

    我在一页上有一个表单 在该表单中 表中的每一行都有一个复选框 我需要计算已选中行的行数 但我什至从 jQuery 中选择它都遇到了麻烦 这是我的复选框代码的样子
  • 红黑高斯赛德尔和 OpenMP

    我试图证明 OpenMP 与 MPICH 相比的一点 并且我编写了以下示例来演示在 OpenMP 中实现高性能是多么容易 Gauss Seidel 迭代被分成两个单独的运行 以便在每次扫描中每个操作都可以按任何顺序执行 并且每个任务之间不应
  • ProxyPass 和 ProxyPassReverse 可以在 htaccess 中工作吗?

    我以前从未设置过代理 我使用的是共享托管 因此要设置 Apache 指令 我需要使用 htaccess 我可以使用 htaccess 执行如下操作吗 有什么限制吗 ProxyRequests Off ProxyPass img http i
  • 从 PHP 获取 CSS 样式

    我正在使用简单 DOM 解析器解析页面 它很简洁 但我想为每个元素获取应用的 css 样式 不仅是内联样式 还包括应用于该元素的每种样式 无论是内联样式 页内样式还是外部样式 有没有一个类可以做到这一点 如果没有 你会怎么做 我并不真正关心
  • 使用 .htaccess 重写查询字符串中的变量

    我在网站中使用 PHP 脚本 该脚本在 URL 中生成查询字符串 查询字符串中的变量之一是 colour red 我想在我的 htaccess 文件中制定一条规则 重写所有实例colour red to colour blue 我无权更改原
  • JQuery:返回上一页时如何返回到完全相同的滚动位置

    我有一个很长的项目列表 当我单击每个项目并返回主列表时 滚动位置丢失了 如何使用 jQuery 返回到相同的精确滚动位置 有什么简单的方法可以做到吗 document ready function update button click f
  • 包含 QML 中的对象的 QAbstractListModel 有哪些缺点?

    Qt 提供了将 C 模型与 QML 相结合的可能性并在文档中建议了三种方法 QStringList QObjectList QAbstractItemModel 前两者使用起来非常简单 例如QObjectList in C QList