问题标签 [qabstractitemmodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - 设置交换列的代理模型时自定义分层模型的视图不正确
我有自定义分层模型,继承自 QAbstractModelItem。另外,我实现了从 QSortFilterProxyModel 子类化的 MySortFilterProxyModel。MySortFilterProxyModel 可以删除和交换列。如果 MySortFilterProxyModel 中的第一列对应于模型中的第一列,则一切正常。但是如果在代理模型中交换它,视图会出现一些问题: MySortFilterProxyModel::hasChildren 工作正常,所以在顶层我在有子元素的元素附近有“+”。但是当我尝试扩展它时 - 没有显示子项。以下是一些 MySortFilterProxyModel 方法:
在调试期间,我发现 MySortFilterProxyModel::rowCount 返回正确的数据。但我也注意到 MyModel::rowCount 不是通过 MySortFilterProxyModel::rowCount 调用的,而是从 QSortFilterProxyModel::index() 调用的。Peharps这是问题吗?
所以具体的问题是什么是实现代理模型以交换和关闭层次模型中的列的正确方法?
请帮我解决问题。谢谢你。
c++ - 通过源模型返回标志使我的项目处于非活动状态(灰显)
在我的代理模型QSortFilterProxyModel
中,基于flags虚拟方法:
如果函数看起来像上面那样(与模型版本相同......只是复制和粘贴),那么项目将正确显示。但是,如果我将此方法的 def 更改为使用sourceModel():
...然后我的 listView 上的项目处于非活动状态。为什么?
qt - 修改外部模型
我有一棵树(场景图),我想通过QTreeView
. SceneGraphModel
是一个子类,QAbstractItemModel
并实现了显示树所需的所有方法,并QModelIndexS
使用指向Node
它们引用的指针分发。
在我尝试SceneGraph
直接操作之前,这工作得很好。这导致了段错误,因为树视图试图Node
在QModelIndex
.
我是否必须通过 进行所有SceneGraph
操作SceneGraphModel
?有没有解决的办法?
qt - QAbstractListModel 和 QList 适配器
我的应用程序存储了一些从对象继承的类型的
QAbstractListModel
对象。
当使用一般的添加、删除和多选功能将简单
std::vector<T>
或 a包装到模型中时,这会生成大量重复代码。QList<T>
是应该使用这种方式QAbstractListModel
还是有一些适配器类可以删除重复的代码(至少对于作为 Qt 一部分的容器)?
示例:我想将其包装vector<ObjectA>
成vector<ObjectB>
一个模型。insertRows
,等的代码总是相同的deleteRows
,columnCount
我想巩固一下(通过一些元编程甚至可以与tuple
and一起工作data
)。
python - 数据源排序后如何更新 QAbstractTableModel 和 QTableView?
我有一个自定义数据结构,我想使用 QTableView 在 PyQt 应用程序中显示。我正在使用 QAbstractTableModel 的子类与数据进行通信。数据结构本身位于一个单独的模块中,对 PyQt 一无所知。
使用 QTableView 显示和编辑数据是可行的,但现在我想对数据进行排序,然后更新模型和视图。
在阅读了 QAbstractTableModel 及其祖先 QAbstractItemModel 的 Qt 文档后,我的第一个方法是尝试这个:
但是,这无法更新视图。我还尝试在模型使用的所有数据上发出 dataChanged 信号,但这也未能更新视图。
我做了一些进一步的研究。如果我理解正确,问题是模型中的 QPersistentModelIndexes 没有得到更新,解决方案是以某种方式手动更新它们。
有一个更好的方法吗?如果没有,我将如何更新它们(最好不必编写一个新的排序函数来跟踪每个索引更改)?
c++ - QAbstractItemModel:为什么在向模型中插入大量项目时发出 dataChanged 和插入行信号这么慢?
嗨,Stackoverflow 中的所有 Qt 模型/视图编程大师。我正在进行的项目需要我为 XML 数据定义一个 QAbstractItemModel 派生模型。之前在实现这个模型的过程中遇到问题的时候在这里问过一个问题: QSortFilterProxyModel crash when delete a row from source model via source model function
除了一些我不知道如何解决的性能问题外,该模型目前在应用程序中做得很好。此应用程序中的功能之一是通过设置 Max Num 和 Rand 数来添加 Frame 元素 xml 节点。每个 Frame 元素将具有从 0 到 MaxNum - 1 和 0 到 MaxRand-1 的 Num 和 Rand 数。此外,我需要为 Rand=0 th 和 Rand=MaxRand-1 th 元素添加一个子 Parameter 元素。简略说明如下:
当 MaxNum 和 MaxRand 都很小时,即 Frame 元素的总数约为 50 时,应用程序运行良好。但是,当元素数超过 500 左右时,通过 QAbstractItemModel 函数添加 Frame 元素变得痛苦且呈指数级缓慢。GUI 冻结了很长一段时间,以至于我大部分时间都放弃了等待。
主要更新:
我发现在我的模型中插入大量(比如 1000 个项目)时导致速度变慢的原因。每个插入的项目我都调用了 insertRow(row, parent) 和 setData() 一次,由于这些函数内部发出的信号,这变得非常昂贵。
我已将代码修改为 insertRows(row, 1000, parent),并定义了一个不发出 dataChanged(currIndex, currIndex) 的新silentSetData()。我还包含了一个名为 notifyDataChanges(startRow, endRow, parentIndex) 的新公共函数,它依次为给定的数据范围发出一次 dataChanged 信号。一切都很好,但现在调用者类需要在插入整个数据集后显式调用 notifyDataChanges。
现在我想知道为什么发出 dataChanged 信号如此昂贵?一次在模型中插入/更改大量项目时,有没有人尝试过其他方法来克服这个问题?
c++ - 如何过滤 QAbstractTableModel 模型
我创建了一个名为 tableModel 的 QAbstractTableModel 模型和一个名为 listModel 的 QAbstractListModel 模型,并且我已将这些模型设置为各自的视图(QTableView 和 QListView)。我想根据 listModel 过滤 tableModel。这意味着当有人点击一个 listitem 并且 tableview 应该根据列表项进行过滤。这些模型运行良好。请帮助我如何进行过滤。
在 QSqlModel 我们可以使用带有 sql 关系的 setFilter 成员来做到这一点。
qt - Qt,QStandarItemModel:自定义 QComboBox 上的委托项,从模型的实例化器填充其内容
我需要在 Qt 中实现一个表,该表在QComboBox
特定列的每一行上显示一个。
基于这个问题:QStandardItem + QComboBox我成功地创建了一个QItemDelegate
. 在该示例中,QComboBox
内容是在ComboBoxDelegate
类上静态定义的,但在我的情况下,我需要QComboBox
在创建的函数中定义内容QStandardItemModel
。
模型在MainWindow
类方法中定义:
然后我应该能够ComboBox
从委托类中恢复内容:
该项目编译得很好,但是当我单击一个单元格更改QComboBox
值时,程序崩溃并且我得到一个“传递给 C 运行时函数的无效参数”。
qt - 多列中的 QTreeView/QAbstractItemModel 子树
我正在研究一个QAbstractItemModel
插入到QTreeView
. 它具有递归Name = Value
类型结构——任何索引都可以有自己的子树。这在左侧很好,因为几乎每个树视图都是这样工作的。问题是有时我只想要右侧的子树 - 值列表。正如我现在拥有的那样,它似乎应该可以工作,但是 Qt 从来没有要求rowCount()
右侧,也从来没有意识到那里应该有一个子树。
我现在拥有的解决方案基本上是为此创建一个单独的模型,并setIndexWidget
在每次发生这种情况时给它一个单独的树视图。这很好,但我真的很想让子树显示在右侧,而不必到处乱扔树视图。我的模型回应说那里有子树,但 Qt 从不要求它们。
如果这有点不清楚,这是我想要完成的基本想法:
事实上,复合值不会在它们旁边获得+
' 和',因为 Qt 从不调用或在该列中,即使我的模型会返回是的,如果被问到,有孩子。-
hasChildren()
rowCount()
如果我最终不得不给它一个子树视图,那很好。我只是想确定没有更好的方法可以先做到这一点。
c++ - Qt QAbstractItemModel - 项目删除崩溃
我正在使用 Qt 类编写一个应用程序,其中我有一个层次结构,我需要在树视图中显示它(我正在使用 QTreeView 小部件)。数据本身如下所示:
我有一个名为 StatisticsModel 的类,它实现了 QAbstractItemModel - 使用它来操作和呈现存储在 StatisticsEntry 树中的数据。该类有一个名为 addStatisticsData 的方法,我用它来将 StatisticsEntry 记录推送到模型中。该方法大致如下所示:
SetTitle 和 setDescription 方法是相同的 - 这是 setTitle 之一:
setData 方法如下:
剩下的是 getItem 方法:
在谈到添加新条目和修改现有条目时,这就是全部内容。在我的应用程序中,我也实现了 QSortFilterProxyModel - 没什么特别的,只是 lessThan 方法。我使用代理模型在显示数据的 QTreeView 中提供排序功能。有以下代码将模型连接到树视图小部件:
在主窗口的标题中:
在主寡妇的构造函数中
该应用程序还有一个按钮,允许我从模型中删除所选项目 - 我目前仅使用 QTreeView::selectionModel()->currentIndex 进行测试,暂时没有多选。
我有 StatisticsModel::removeRows 方法的以下代码
问题是,有时当我使用 QAbstractItemModel::removeRow 方法删除项目时,会出现异常并且堆栈跟踪如下所示:
奇怪的是,这似乎发生在所有有关删除项目的直接方法调用已经结束之后。似乎代理模型正在寻找不再存在的模型索引(或者我认为)。StatisticsModel::parent 方法如下:
当异常发生时,与上述方法中的 childItem 和 parentItem 变量关联的值似乎无效 - 指针本身指向不可访问的内存,或者成员 QLists 没有条目,或者它们的条目存在内存访问冲突。可能是父方法不正确,但是如何获取父索引 - qabstractItemModel 文档不鼓励在该方法中使用 QModelIndex::parent ,因为它会创建无限递归。
任何帮助,将不胜感激,