问题标签 [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 投票
3 回答
11159 浏览

qt - QTreeWidgetItem 中的角色是什么?

我有QTreeWidget几个列,我添加QTreeWidgetItems到它。我尝试使第二列包含每个列的数值,Item以便我可以按此值对项目进行排序

我找不到任何关于这个role论点的文档。我所知道的是,如果我将其设置为 1 或 2,则列中会显示一些内容,如果我将其设置为 0 或 >=3,则列中不会显示任何内容,无论如何,数字总是按字母顺序排序,这是错误的。

0 投票
3 回答
2471 浏览

qt - QObject::connect 问题与 QAbstractItemModel

我有一个 QListView,我从中获得一个 QAbstractItemModel 与 list->model();

在此之后,我想将 dataChanged 信号连接到我的自定义 QObject:

这是我的自定义对象:

我做错什么了吗?QObject 调用返回 true,我在 onText 函数中有一个 cout,但是当 QListView 更改时没有打印任何内容。

0 投票
2 回答
2584 浏览

qt - 帮助在 Qt 的 rowInserted 信号后获取插入的数据

我有一个连接到 QAbstractItemModel 的 rowsInserted SIGNAL 的 onText 方法,因此可以在插入新行时收到通知:

信号工作正常,因为插入行时我会收到通知。这是 onText 方法:

但我似乎无法从插入的项目中获取字符串。传递的 QModelIndex“父级”无效,并且“m”QAbstractItemModel 为 NULL。我认为这是因为它不是一个实际的项目,而只是一个指向一个的指针?如何获取插入的文本/元素?

0 投票
1 回答
2007 浏览

qt - 我可以为 QAbstractItemModel 声明根项目吗?

我知道可以为项目视图设置父模型索引,但我想为模型执行此操作。

原因很简单,我想摆脱那些结构:

0 投票
2 回答
2199 浏览

c++ - 使用 QAbstractItemModel (C++) 支持多添加/删除(和撤消/重做)

问候,

我一直在编写一些讨厌的代码来支持从我的模型中删除任意一组对象的撤消/重做。我觉得我做对了,因为所有其他的修改器(添加/复制粘贴)都是这个功能的子集。

代码比我需要的更糟糕,主要是因为改变模型的唯一方法是调用 beginInsertRows/beginRemoveRows 并删除一个范围内的行(一次只做 1 行,无需将“邻居”优化为单个打电话呢)

beginInsertRows/beginRemoveRows 的问题是删除一行可能会影响另一个 QModelIndex(例如,缓存在列表中的一个)。例如:

假设我选择 ChildObj1 和 ChildObj3 并删除它们,如果我先删除 ChildObj1,我已经更改了 ChildObj3 的 QModelIndex(行现在不同)。如果我删除父对象(但我已通过从对象列表中“修剪”子对象来解决此问题),则会出现类似问题。

以下是我考虑过解决此界面限制的方法,但我想在继续前进之前我会要求更好的方法:

  1. 移动“向后”,假设提供的 QModelIndices 列表是从上到下排序的,只是从下往上。这确实需要可靠的排序,并且排序可能是幼稚和缓慢的(也许有一种对 QModelIndexes 集合进行排序的聪明方法?或者 QItemSelectionModel 提供好的(有序)列表?)

  2. 每次删除/添加对象时更新其他 QModelIndeces(想不出非天真的解决方案,搜索列表,在需要的地方获取新的 QModelIndeces)

  3. 由于更新实际数据很容易,只需更新数据并重建模型即可。这看起来很奇怪,我可以想象它在处理大量数据时会变得很慢。

这些是我目前的想法。我现在正在研究选项 1。

问候,丹 O

0 投票
2 回答
291 浏览

qt4 - 存储和编辑(GUI)类目录树结构的最优雅/安全/简单的解决方案?

我有一个稍微棘手的问题要解决;想象一下:

我的一个应用程序需要大量使用脚本,所以我的想法是为用户提供一种编写脚本片段并将它们组织成类似目录的树结构的方法。这很像带有子目录和源文件的源代码目录。

数据类/存储

我遇到的第一个问题是我需要找到一种存储整个树结构的好方法(在磁盘上,以及在运行时的应用程序中)。为此,我有以下想法:

  1. 使用可以使用 QObject 的父/子功能表示树的 QObject 派生类。这样,如果它们的父对象被删除,我就不必担心删除这些对象。
  2. 使用一个简单的类,它可能包含一个 QList(没有指针)的子级和一些存储每个组/脚本的属性的属性。
  3. 使用方法#2,但使用指针而不是静态对象 - 当我必须将组或树的一部分传递给函数等时,这将避免无用的复制。
  4. 使用 SQLite(或类似)数据库的实时后端,并在运行时查询它。这将避免一次加载整个树并将其保存在 RAM 中。
  5. 在文件系统上使用平面文件和目录结构;尽管我认为这会带来不必要的麻烦,因为无法存储有关对象的元信息。

编辑

我遇到的下一个问题是用户可能想要编辑整个树结构。他想单击一个组或脚本,编辑脚本代码,并可能在树中拖放目录和脚本;从而在途中改变整棵树的结构。

这会引发以下问题:

  1. 如果用户关闭编辑器,最好向他提供“您要保存更改吗?”。对话。很像一个文本编辑器,您不小心在现有文档中输入了一些内容,但您在没有保存更改的情况下退出了。- 这将要求我们编辑整个树的副本,并在需要时覆盖应用程序中的现有树。
  2. 允许拖放可能有问题...
    • ...使用存储方法#1:目前没有改变 QObjects 子级顺序的好方法。在运行时移动对象而程序的其他部分可能会访问它们也不是一个好主意。
    • ...使用存储方法 #2更容易,因为整个树像单个值一样处理,并且没有孩子我必须移动和重新父母。复制树的一部分会自动复制所有子节点,依此类推。不幸的是,这将意味着大量开销和灵活性损失(我不得不将整个树再次写入磁盘,因为我无法确定到底发生了什么变化)。

当我想到更多事情时,我可能会稍微更新一下这个问题,但我真的很好奇其他人是如何解决这个问题的。任何建议和想法表示赞赏。:)

0 投票
2 回答
1415 浏览

c++ - 如何在 QTreeView 的 QAbstractItemModel 中创建人工节点

我的问题是关于 Qt 及其QAbstractItemModel

我有一个字符串和双精度 ( std::map<stringclass, double>) 的映射,我想在 Qt 小部件中呈现它。虽然我可以为此使用QTableView,但我想利用地图的键是“ abc.def.ghi”形式的事实,其中可以有多个以“ abc.def”开头的字符串,甚至更多以“”开头的字符串abc

所以我想设置一个树数据模型来呈现QTreeView中的项目,比如

my 的键std::map是树的叶子,所有其他节点都是临时和辅助构造,以支持折叠以方便用户使用。

不幸的是,方法rowCountindexcolumnCountdata有 const 修饰符,所以我不能简单地为我的QAbstractItemModel派生中的标题设置一个辅助数据结构并在那里更改该数据结构。

什么是最好的做法?我应该在我std::map的和QAbstractItemModel之间设置另一个类层还是有更聪明的方法来做到这一点?


编辑 1:在显示和使用QTreeViewstd::map时可以更改,因此辅助节点可能会被丢弃并重建。我的假设是处理此问题的最佳方法是重组QAbstractItemModel - 还是我应该简单地丢弃该模型并将新构造的模型分配给QTreeView?在那种情况下,我想我可以在构造函数中设置所有节点,而不会被方法的 const 性所困扰。

0 投票
2 回答
5094 浏览

python - 如何从 PyQt4 中的 QVariant 取回我的 python 对象?

我正在创建一个QAbstractItemModel要显示在QTreeView.

我的index()and函数使用继承parent()的函数创建并为其提供,和需要的。在这里,出于测试目的,数据是 Python 字符串。QModelIndexQAbstractItemModelcreateIndexrowcolumndata

index()parent()data()函数中,我需要取回我的数据。它以QVariant. 如何从 QVariant 取回我的 Python 对象?

0 投票
2 回答
6594 浏览

c++ - QTableView排序信号?

我使用QTableView+QStandardItemModel来显示一些数据(存储在其他数据结构中的数据),并且这个表视图是可排序的。

既然是可排序的,那么在对这个模型进行排序的时候,我还需要对存储数据的顺序进行排序。我尝试为排序信号实现一个​​插槽,但我不知道单击标题以启动排序操作时会发出什么信号。

我尝试了 clicked 信号,但它只针对数据行发出,而不是针对 headerData。如果我想在对QtableView+进行排序时做其他事情该QStandardItemModel怎么办?

0 投票
2 回答
20385 浏览

qt - 如何在 QAbstractItemModel 和 QTreeView 类中找到子项?

问题:如何在带有方法的QTreeView加载QAbstractItemModel模型中找到子项目model->match()

问题model->match()找不到子项目,wtf?!

这是示例:

替代文字

从图片中可以看出,我正在尝试Layouts使用以下代码扩展子项:

其中settings.ini文件包含:


PS:根项目在启动时成功扩展!