何时从 QAbstractItemModel 发出 dataChanged

2023-12-13

在 Qt 中,我有一个模型子类化QAbstractItemModel- 它是显示在 QTreeView 中的树。

该模型支持各种形式的更改,并且都可以正常工作。相关的两个是:

1)少量相关行中的部分数据发生变化

2) 可视化更改意味着大多数行应更改其格式 - 特别是背景突出显示的更改。他们的DisplayRole数据不会改变。

当前的设计以相同的方式处理这两个问题:对于模型发出的每一行发生的任何更改dataChanged(start_of_row_index,end_of_row_index)。我为发生变化的父行及其任何发生变化的子行发出信号。

然而,随着模型变大,在情况 2 中这会表现得很差:大量的dataChanged发出信号。

我更改了代码,以便在情况 2 中模型发出dataChanged仅适用于作为整个树的父级的(单)行。

这似乎仍然可以正确工作,但不符合我对模型职责的理解。但我怀疑我可能是错的。

也许我误解了dataChanged信号?它实际上会导致视图更新所有子级以及指定范围吗?或者我可以避免排放dataChanged当它不是DisplayRole那正在改变吗?

编辑了我迄今为止的进展

正如简指出的那样,我应该发出dataChanged对于情况 2 中的大多数或全部行。

我的代码最初是通过发出来做到这一点的dataChanged对于每个更改的行,但这太昂贵了 - 视图需要太长时间来处理所有这些信号。

一个可能的解决方案是聚合dataChanged为更改行的任何连续块发出信号,但是当例如每隔一行都发生更改时,这仍然无法很好地执行 - 它仍然会发出太多信号。

理想情况下,我只想告诉视图将所有数据视为可能已更改(但所有索引仍然有效 - 布局不变)。对于单个信号来说这似乎是不可能的。

因为一个怪癖QTreeView类,有可能(尽管根据规范不正确)只发出一个dataChanged(tl,br) 只要tl != br。我已经完成了这个工作,它通过了我们的测试,但让我感到紧张。

我现在已经确定了一个遍历树并发出一个单一的版本dataChanged(tl,br)对于每个父母(tl,br 涵盖该父母的所有孩子)。这符合模型/视图协议,对于我们的模型来说,它通常会将信号数量减少大约 10 倍。

然而,这似乎并不理想。还有其他建议吗?


您预计会让你的意见知道每当任何数据发生更改时。这种“告知”可以通过多种方式进行;发射dataChanged当索引结构没有改变时,是最常见的一种;其他人是“严重”的,比如modelReset or layoutChanged。巧合的是,Qt 的一些视图即使没有dataChanged例如鼠标悬停,但你不应该依赖它。这是一个实施细节,并且可能会发生变化。

回答你问题的最后一点,是的,dataChanged每当从返回任何数据时都必须发出QAIM::data()变化,即使它“只是”其他角色Qt::DisplayRole.

您引用的是性能问题。硬性数字是多少——您是否确实得到了任何可测量的放缓,或者您只是过早地担心这可能会成为以后的问题?您是否知道您可以使用这两个参数dataChanged来表示一个大索引矩阵的变化?

EDIT:

还有一些需要尝试的事情:

  • 确保您的视图不请求额外的数据。例如,除非您设置QTreeView's uniformRowHeights(IIRC),视图必须为每个执行 O(n) 次调用dataChanged信号,导致 O(n^2) 复杂度。那很糟。

  • 如果你确实确定没有办法解决这个问题,那么你might结合起来摆脱layoutAboutToBeChanged, updatePersistentIndexes and layoutChanged。由于您实际上并未更改索引的结构,因此这可能相当便宜。不过,上一点的优化机会还是值得抓住的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时从 QAbstractItemModel 发出 dataChanged 的相关文章

  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • 如何将枚举类传递给 QML?

    我正在学习QML with Qt并在通过时遇到一些麻烦enum class to qml 当我使用信号时int参数 一切正常 代码运行完美 But 麻烦就在这里 如果我使用信号与一些enum class我有参数undefinedqml 信号
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调

随机推荐

  • Google 日历 API 日期时间

    我正在尝试让 Google Calendar Api 正常工作 如果不使用我的 POST 日期时间 它就可以完美工作 但日期是像谷歌那样硬编码的 这不是我想要的 当我使用 POST 变量时 它向我显示以下错误 Fatal error Unc
  • 如何在没有QProxyStyle的情况下修改样式提示?

    我使用 Qt 的 Python 绑定 PySide 或 PyQt4 他们没有QProxyStyle 我想更改样式提示的值 例如改变SH Menu SubMenuPopupDelay子菜单弹出延迟时间 在本机 C Qt 中我会使用QProxy
  • Python - 斐波那契函数变量值声明之间的差异

    我是 python 的初学者 我正在研究一种制作斐波那契函数的类型 def fib n a 0 b 1 while a
  • AdMob 广告单元 ID 需要多长时间才能生效?

    大约 4 小时前 我创建了一个新的广告单元 ID 并开始在未发布的 Android 应用程序的发布版本中使用它 但我得到的只是一个空白视图和以下 logcat 输出 W Ads Received error HTTP response co
  • 使用 getElementsByClassName 操作样式[重复]

    这个问题在这里已经有答案了 我不明白为什么我无法在代码中操纵 special 的样式 我确信这很简单 但它不起作用 h1 I am an h1 h1 p class special Hello p p class special Goodb
  • ADF 从代码手动调用操作

    我想从按钮 ActionListener 执行数据控制操作 CreateInsert 和 Delete 我知道可以从 数据控件 菜单插入数据控制按钮 但由于各种原因我需要这样做 其中一个突出的原因是我需要执行额外的运行时检查 我找到了以下代
  • Python 随机无重复

    这是我的代码 我试图用 0 6 之间的 7 个数字填充一个列表 没有重复 并且每次都是随机顺序 这是我的代码 但我不断收到错误 列表分配索引超出范围 但我不知道我的错误在哪里 这是我的代码 import random def generat
  • 高级 C 问题:请解释 C 构造 *({ foo(&bar); &bar; })

    这最终是在研究Linux内核源代码的completion h中的代码时出现的一个C问题 在那里我看到了我以前从未在C中使用过的C技术 虽然对它在做什么有一个模糊的感觉 但我想用精确的描述来调整我的理解 而且我不太确定如何在没有可能漫长的考验
  • 使用 PHP 时,我可以使用 JDBC 或 ODBC 连接吗?

    我有一个 PHP 应用程序 我想从 MySQL 切换到 Cache DB 我想知道是否可以使用 JDBC 或 ODBC 连接 因为 Cache 不附带 PHP 连接 Thanks PHP 可以使用 ODBC 连接directly或通过PDO
  • JPA 枚举的映射集合

    JPA 有没有办法在实体类中映射枚举集合 或者唯一的解决方案是将 Enum 与另一个域类包装并使用它来映射集合 Entity public class Person public enum InterestsEnum Books Sport
  • 斐波那契数列的负输出

    尽管使用了斐波那契数列 但在添加大量数字时 我得到了负输出long int 如何解决这个问题 include
  • Hibernate - 复合主键包含外键

    我有一个类似的问题如下 但解决方案并没有解决我的问题 hibernate复合主键包含复合外键 如何映射这个 我正在尝试连接两个表 每个表都有一个带有部分外键引用的复合主键 Table A f1 pk f2 pk f3 pk f4 pk Ta
  • 如何阻止特定应用程序访问我的网站

    有人有一个应用程序 Android 可以访问我的网站并显示一些页面 我本来可以接受它 除非该应用程序有一些错误 并且使用它的人无法使用该网站的某些功能 我怎样才能阻止这个特定的应用程序 附 我拥有对我的网络服务器的根访问权限 并且它是专用的
  • LD_LIBRARY_PATH

    我可以为单个应用程序设置 LD LIBRARY PATH 吗 我正在调查系统调用失败 那么有什么方法可以使用 LD LIBRARY PATH 设置设置正确的路径 最简单的方法是创建一个 shell 脚本 让 shell 脚本导出新的 LD
  • 使用 dompdf 生成 pdf 图像时出错

    我必须在生成的 PDF 的每一页中显示徽标 虽然它在本地系统中工作正常 但在服务器中抛出以下异常 Fatal error Uncaught exception PDFlibException with message Handle para
  • 如何在 JScrollPane 中获取 JScrollPanes 以跟随父级的大小调整

    所以我有一堆JTables Each JTable是在一个里面JScrollPane 然后我将添加其中的每一个JScrollPanes to a JPanel 然后我添加这个JPanel to a JScrollPane然后到另一个JPan
  • 为什么我无法用 Prolog 得到 Ship Puzzle 的答案?

    我需要使用 Prolog 解决 Ship Puzzle 问题 以下是事实 有5艘船 希腊的船六点出发 载着咖啡 中间的船有一个黑色的烟囱 英国船九点出发 有蓝色烟囱的法国船位于一艘运载咖啡的船的左侧 运载可可的船的右侧是一艘开往马赛的船 这
  • 检测序列的排列

    我有一个像这样的数字列表 数组 1 2 3 4 所以我的目标是检查给定的另一个数组 如果该数组是原始示例的排列 则该数组 3 4 1 2 and 1 2 4 3 是原始的排列 但是 1 2 1 1 or 1 5 4 3 not 两种可能的解
  • 确定重叠 DATETIME 范围的最大数量

    我有一张桌子 上面有一些DATETIME范围 比如 id start end 1 2011 12 18 16 00 00 2011 12 18 17 00 00 2 2011 12 19 08 00 00 2011 12 19 10 00
  • 何时从 QAbstractItemModel 发出 dataChanged

    在 Qt 中 我有一个模型子类化QAbstractItemModel 它是显示在 QTreeView 中的树 该模型支持各种形式的更改 并且都可以正常工作 相关的两个是 1 少量相关行中的部分数据发生变化 2 可视化更改意味着大多数行应更改