- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Qt 中,我有一个模型子类 QAbstractItemModel
- 它是在 QTreeView 中显示的树。
该模型支持各种形式的变化,它们都可以正常工作。相关的两个是:
1)少量相关行中的一些数据发生变化
2)可视化更改意味着大多数行应更改其格式 - 特别是它们具有背景突出显示的更改。他们的DisplayRole
数据不变。
当前的设计以相同的方式处理这两种情况:对于有任何更改的每一行,模型都会发出 dataChanged(start_of_row_index,end_of_row_index)
.我为改变的父行和改变的任何子行发出信号。
然而,当模型变大时,这在案例 2 中表现不佳:dataChanged
的数量非常大。发出信号。
我已经更改了代码,以便在案例 2 中模型发出 dataChanged
仅适用于作为整个树的父级的(单)行。
这似乎仍然可以正常工作,但不符合我对模型职责的理解。但我怀疑我可能错了。
也许我误解了dataChanged
信号?它实际上是否会导致 View 更新所有子项以及指定范围?或者我可以避免发出 dataChanged
当它不是 DisplayRole
那正在改变?
编辑了我到目前为止的进展
正如 Jan 指出的那样,我应该发出 dataChanged
对于案例 2 中的大多数或所有行。
我的代码最初是通过发出 dataChanged
来实现的。对于每个更改的行,但这太昂贵了 - View 处理所有这些信号的时间太长。
一个可能的解决方案是聚合 dataChanged
为更改行的任何连续 block 发出信号,但是当例如每隔一行发生更改时,这仍然不会很好地执行 - 它仍然会发出太多信号。
理想情况下,我只想告诉 View 将所有数据视为可能已更改(但所有索引仍然有效 - 布局未更改)。对于单个信号,这似乎是不可能的。
由于 QTreeView
的一个怪癖类,有可能(尽管根据规范不正确)只发出一个 dataChanged(tl,br
) 只要 tl != br
.我有这个工作,它通过了我们的测试,但让我很紧张。
我现在已经确定了一个遍历树并发出单个 dataChanged(tl,br)
的版本。对于每个 parent (tl,br 跨越该 parent 的所有 child )。这符合模型/ View 协议(protocol),对于我们的模型,它通常将信号数量减少约 10 倍。
然而,这似乎并不理想。还有其他建议吗?
最佳答案
每当任何数据发生更改时,您都应该让您的 View 知道。这种“让知道”可以通过多种方式发生;发射dataChanged
是索引结构没有改变时最常见的一种;其他是“严重”的,例如 modelReset
或 layoutChanged
.巧合的是,即使没有 dataChanged
,Qt 的某些 View 也能够获取更改。例如鼠标悬停,但你不应该依赖它。这是一个实现细节,也是一个可能发生变化的主题。
要回答你问题的最后一点,是的,dataChanged
每当从 QAIM::data()
返回任何数据时都必须发出变化,即使它“只是”Qt::DisplayRole
之外的某个其他角色.
你在引用性能问题。硬性数字是多少——您实际上是否有任何可衡量的放缓,或者您是否过早地担心这可能会成为以后的问题?您是否知道可以使用 dataChanged
的两个参数这一事实?表示一个大的索引矩阵的变化?
编辑:
还有几件事要尝试:
QTreeView
的uniformRowHeights
(IIRC), View 必须为每个 dataChanged
执行 O(n) 次调用信号,导致 O(n^2) 复杂度。那很糟。 layoutAboutToBeChanged
来逃脱。 , updatePersistentIndexes
和 layoutChanged
.由于您实际上并未更改索引的结构,因此这可能相当便宜。不过,前一点的优化机会还是值得把握的。 关于qt - 何时从 QAbstractItemModel 发出 dataChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561974/
我需要在 PyQt 中将 QAbstractItemModel 与 QTreeView 一起使用。 在 dropMimeData 方法中,我想删除源行(如果它是某个 MIME_TYPE。)如何获取源的
我有一个 map = std::map ,其中 myItemModel继承QAbstractItemModel . 我现在要合并所有 myItemModel合一myItemModel (其他所有元素模
我的 QAbstractItemModel 的实现正在监听一些事件,并在单独的线程中处理更新。 处理更新可能会导致模型中的布局和/或数据更改。 数据本身的存储是boost::mutex - prote
你好来自 SO 的好人! 今天我一直在问自己很多关于我试图实现的事情。 说到这里,我正在尝试使用 Qt 编写某种终端代码,它将用于显示来 self 的应用程序不同部分的消息。 现在我实现了一个模型类(
我为我的模型继承了 QAbstractItemModel 类。为了轻松地将新项目插入模型,我编写了下一个方法: void addItem(MyData *parent, MyData *childre
在创建项目模型时,例如通过子类化 QAbstractItemModel,是否要嵌套行插入和删除等基本操作? 例如,在实践中,必须在调用 ::beginInsertRows() 之后立即调用 ::end
我仍然很难理解 QAbstractItemModel 的项目表示。有两种方法可以返回 QModelIndex 项目,这对我来说没有任何意义。 QModelIndex QAbstractItemMode
我正在研究 QAbstractItemModel 的子类插入 QTreeView .它有一个递归Name = Value类型结构 - 任何索引都可以有自己的子树。这在左侧很好,因为几乎所有的 Tree
一起使用 Qt 的图形 View 和模型 View 框架的最佳方法/模式是什么? 似乎 Qt 应该以某种方式将这两件事联系在一起,但没有。 QGraphicsItem 可以只保留一个 QModelIn
我正在尝试为 TreeView 实现一个简单的模型,但我不知道为什么它不起作用。似乎我所有的节点都是我的 的子节点。根节点,尽管其中三个应该是它的子节点 第一 child 。我也可以看到我的 hasC
QAbstractItemModel 有一个 setHeaderData( int section, ..... ) 方法,该方法根据标题方向采用行或列的部分。我有一个模型,其中包含几个表,这些表都是
我正在实现一个基于 Qt 的树 View ,其中 View 是基于 QTreeView 的类,模型是基于 QAbstractItemModel 的类。这棵树应该有数百万个节点。我正在实现一种过滤机制,
我是 (Py)Qt 新手,现在将 C# GUI 代码移植到 Qt 几天了。我一直问自己的一个问题是为什么 QAbstractItemModel提供 parent() 所需的子类方法,以及为什么他们需要
我有一个关于通知模型对其存储引用的其他对象所做的更改的问题。 我知道信号 dataChanged(),但我不确定如何使用它。例如,我的模型存储了对其他对象的引用(我们称之为 myObjPtr)。只有在
我第一次尝试使用 QTreeView 与 QAbstractItemModel 并立即遇到问题。 QAbstractItemModel 接口(interface)将方法声明为 const ,假设他们不
我使用继承 (QSqlQueryModel) 制作了myModel,并且我 将列插入其中。我想插入 QString 类型的数据,但我不知道该怎么做。 QSQlQueryModel 是只读模型。要使其可
我使用 Qt example for QAbstractItemModel我尝试更新 Item到给定的 index . 我尝试使用 emit DataChanged但它不起作用, View 未更新 .
我一直在努力思考如何为 QAbstractItemModel 开发标准样式的迭代器,但我陷入了困境。我可以使用深度优先或广度优先算法搜索模型,但在将这些模式应用于迭代器时,我不确定如何进行。有人可以直
我正在基于 QAbstractItemModel 实现我的模型,并将其与 QTreeView 一起使用来显示分层数据。数据存储在sqlite表中。 我的问题是添加子节点时应该如何调用beginInse
我正在尝试基于 QAbstractItemModel 创建自己的模型。看起来效果很好。它通过了模型测试断言。 当我删除一行时,我遇到了这个奇怪的问题。删除操作正常。但随后其他行变得不可选择(并非全部)
我是一名优秀的程序员,十分优秀!