问题标签 [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.

0 投票
0 回答
1007 浏览

expand - Qt:ProxyModel、QTreeView 和带过滤的委托设置无法正确更新

我有一个 QTreeView 设置显示 QSortFilteredProxyModel 在 filterAcceptsRow() 中自定义过滤,只接受取决于父行值的值的行(通过 QStyledItemDelegate 派生类在 QComboBox 中选择。例如,如果我在一行中选择“类型” 值“宝马”,我想为这个特殊情况显示孩子。这对第一个项目很有用,我可以在 Item1 中选择这些值多个级别(最多 5 个级别)。一切都很好。

但是,我注意到,一旦我使用 item1 和此自定义过滤,然后添加 item2,问题就开始了。我注意到的第一件事是,QTreeView 确实取消了 item1/item2 的公共父项,并且只显示了根项的子项。正常行为(以及添加 item1 的行为确实如此)是扩展 item1 的父项。为什么这会对第二个项目感到困惑,并且只有当我一直在玩 item1 的儿童设置 idk 时。此外,我注意到在 item2 中过滤无法正常工作。我在 item2->Type 中有一个 QComboBox,其子项取决于 item2->Type 值。. QComboBox 的默认值的第一个子项仍会按应有的方式显示,但是在更改 QComboBox 时,视图不再更新,并且留在 item2/item3/... 中的第一个加载的子项 但是,使用正确的值/索引调用 Delegate::setModelData 并相应地调用 TreeItem->setData() 。只是过滤似乎卡在了 TreeItem->data() 的旧值上。请再次注意,这只发生在我玩过 item1 之后。如果我不碰那个项目,我可以正确玩所有其他项目(item2,item3,...)并且它做得很好。

如果有人可以提供帮助,我将非常高兴。

有没有人给我提示,什么可能导致扩展状态的“重置”,即使 expand() 被称为 item1 和 item2 插入并且对 item1 很好用?什么可能导致我的进一步问题?

ExampleDelegate.h

代理模型.h

代理模型.cpp

0 投票
1 回答
1444 浏览

c++ - QTreeView 不显示数据

我从 QAbstractItemModel 派生来编码我自己的数据树,但 QTreeView 没有显示。

由于错误的变量寿命,我看到的大多数类似问题的答案都得到了解决,所以这是我分配模型的代码:

在构建模型时,它的根节点会填充数据,稍后将根据需要加载更多数据(通过fetchMore)。

我开始输出每个被调用的函数。这是调用序列的日志:

输出roleNames()

最后四行然后永远重复(或至少直到我失去耐心)。对我来说,看起来根数据已被获取,但它们从未显示出来。奇怪的是,data-的最后一个参数是int role13,它没有被定义为任何角色(我仍然无条件地返回有效字符串)。

实施此操作时我错过了什么吗?

0 投票
1 回答
9164 浏览

c++ - 在 QTreeView 中插入和删除行

美好的一天,我有从 QAbstractItemModel 继承的基本模型,以及一些不时通知该模型的后台线程,在示例中,插入行实现了这样的事情

但我不能这样做,因为我的模型是单一的,它使用 4 个视图,我已经以这种方式实现了我的插入:

s_notify具有实现的类在哪里:

鉴于此,我调用该方法:

删除行完美,但插入不起作用。我的实施有什么问题?

0 投票
1 回答
2610 浏览

c++ - QAbstractItemModel->setItemData 在插入 Qt::UserRole 时返回 false

我不知道为什么当我尝试插入Qt::UserRole项目QTreeView时它总是返回 false 但当我输入时却没有,Qt::EditRole 这是代码:

0 投票
2 回答
4829 浏览

qt - PySide (PyQt) QAbstractItemModel

我正在尝试为树视图实现一个简单的模型,但我不知道它为什么不起作用。似乎我的所有节点都是我的根节点的子节点,尽管其中三个应该是它的第一个子节点的子节点。此外,我可以看到我的hasChildren方法陷入无限循环。任何帮助将不胜感激。

这是我的代码:

0 投票
1 回答
210 浏览

c++ - QTreeView insertRows 通过方法粉碎/直接调用工作

我有以下奇怪的问题。

我已经实现了一个 QAbstractItemModel,以至于我可以将子节点插入到树视图中,但是当我尝试通过 insertRows() 方法添加节点时会发生一些奇怪的事情。

首先调用 all 的地方:

这是 rootNode.log() 调用的输出:

如您所见,“Potato”节点已正确插入。

查看图片 http://www10.pic-upload.de/04.01.13/m65huuqq4ruu.png

但是,一旦我尝试扩展 childNode1 节点,它就会崩溃。但是请看上面代码中的最后一条注释。正如我提到的 - >如果我现在尝试输出树视图(它遍历所有节点)它会崩溃。

当调用该方法时,一切似乎都正常 - 只是当我尝试扩展树视图时它崩溃了 -> 调试输出让我认为一切都应该没问题

实际的错误消息是在位置读取时访问冲突......(从德语翻译 - 不知道它是否在英语中称为相同)

}

上述方法的调试输出:

我不知道为什么会发生这种情况,因为调试输出看起来是正确的,它应该与通过 insertChild 方法直接插入节点基本相同。

我希望有人知道为什么它不起作用。

最好的问候,迈克尔

0 投票
2 回答
12587 浏览

qt - Qt - QTreeView 和带有复选框列的自定义模型

我想要一个树视图,它在各个列中显示项目名称、项目描述和两个相关的布尔值。我从修改Editable Tree Mode 示例开始,所以有一个 TreeModel 跟踪一组 TreeItem,每个 TreeItem 不仅有一个子 TreeItem 列表,还有一个 QVariants 列表,它存储一组值,以后可以显示在 QTreeView 的列中。

我设法为两个布尔值添加了另外两列。我还在网上搜索了如何为 QTreeView 和 QAbstractItemModel 添加复选框。我设法让两个布尔列上的复选框以及树层次结构的其余部分正常工作。然而,每列中的所有项目现在都呈现一个复选框和一行文本。

带有复选框的 Qt TreeView

这是我从示例中修改的部分,主要在 TreeModel 中。

树模型.cpp:

主窗口.cpp:

非布尔列下的复选框不响应用户输入,并且布尔列下的文本不可编辑。所以功能方面没有错,但就 UI 而言仍然很麻烦。

我正在让 QTreeWidget 做同样的事情。同时,我不禁想知道我在这里是否还缺少其他东西。我听说一种解决方案是有一个自定义委托;那是唯一的选择吗?

如果有人能指出我还需要做什么,或者提供类似的例子,我将不胜感激。

0 投票
1 回答
665 浏览

qt - QAbstractItemModel——被重置?QItemDelegate::paint() 被频繁调用

这真让我抓狂。我有一个 QAbstractItemModel、QSortFilterProxyModel 和一个 QStyledItemDelegate。都是子类。在发出以下 dataChanged() 之后,应该只为这两个索引(0,0 和 0,1)调用 QStyledItemDelegate::paint()。但是,我已经确认所有可见单元格都调用了它。

可以肯定的是,我已经将一个插槽连接到我的模型和代理的 modelReset() 和 layoutChanged() 信号。它做了一个简单的 printf()。但是,它永远不会被调用。我很确定我没有对视图或委托做任何时髦的事情。但是,也不完全确定在哪里看。

0 投票
0 回答
175 浏览

qt - 使用外部源在 QAbstractItemModel 中实现更改通知

我正在实现一个QAbstractItemModel表示可以在外部更改的数据。我的模型将在更改发生后收到有关更改数据的通知,而在更改发生之前我无法收到通知。当我的模型收到更改通知时,旧数据不再可用。

据我了解文档,方法beginInsertRowsbeginRemoveRows必须在更改之前调用,而旧数据仍然可用。

我的理解正确吗?如果是这样,我的替代方案是什么?

0 投票
2 回答
208 浏览

c++ - ModelResetter RAII 对象

我有一个自定义代理模型,当将新列/行添加到其源模型时,它偶尔会自行检修。从文档看来,在此类操作的开始和结束时调用QAbstractItemModel::beginResetModel()QAbstractItemModel::endResetModel()是正确的方法。不幸的是,我的检修功能有几个可能的退出点,我只知道我会忘记endResetModel在每个退出点调用,因为它变得更加复杂。

因此,我想创建一个简单的 RAII 类,它将调用beginResetModel构造然后调用endResetModel破坏,如下所示:

问题在于,beginResetModel()两者endResetModel()protectedQAbstractItemModel. 在我的继承模型中声明ModelResetter为 a似乎没有帮助,因为我正在尝试与基类交互。friend class

我不想为我实现的每个模型都做一个自定义实现,那么我可以用模板来做这个吗?我对模板语法还不是很熟悉。

编辑 1:(我删除了编辑 2 中的示例模板代码以避免混淆)

如果我能以某种方式将模板限制为只允许继承的类型,那就太好了QAbstractItemModel,但我在标准 C++ 中看不到任何允许这样做的东西。我不会使用 Boost。

编辑 2:我想我并不清楚我的要求。他们来了:

  • 对一般情况的基类进行操作
  • 在调试模式下强制QAbstractItemModel继承要求,而在发布模式下没有惩罚
  • 使用简单,几乎没有开销
  • 不需要修改基类或新函数