2

我正在寻找一种在未完全初始化的模型上创建无限视图的方法。我想创建类似于 Excel 电子表格的东西,我所做的只是从一个初始化模型开始(例如 100x100 空单元格,可能在一个具有空值的数据库上工作),然后动态添加下一行/列(和更新视图)一旦我们接近滚动条的末尾。

但我想知道这是否是最好的解决方案——我想我肯定会从一个只填充部分的模型中受益——我的意思是在模型中只存储关于填充单元格的信息,并让视图处理显示“空单元格” (一旦我们 - 例如 - 单击它们就会创建)。我知道有必要存储 XY 位置和单元格数据(而不仅仅是一个带有数据的 2D 容器),但我想尝试不同的解决方案:

  • a) 有一个类似指针的容器,其中包含一个填充单元的列表,它们在 2D 平面上的位置
  • b) 有一个大小为 (x,y) 的 2D 容器,其中 x 和 y 表示给定维度中的“最后填充的单元格”

对于这两种解决方案,我想在写入数据后动态分配更多位置。

所以我的问题是——如果没有填充空数据的模型甚至可以显示“幽灵单元”,如何使用 QT 模型/视图编程来实现?如果我能简要解释一下它是如何在 excel 等应用程序中完成的,那就太好了。

4

1 回答 1

1

好吧,除非您使用具有无限位数的数字实现一些索引,否则您的表永远不会真正无限,在这种情况下,您可能无法使用 Qt 类。

但我认为你应该选择一些足够大的数字来定义最大值。它可能是一个非常大的数字……如果您在 64 位机器上,那么您的“无限”表可以有 9,223,372,036,854,775,807 行和相同数量的列。这个大数字恰好是有符号的 64-bit 的最大值int。并int用于索引QModelIndexinQAbstractItemModel. 因此,您的二维“Excel”表中总共可以有 8.5070592e+37 个单元格。如果这个表大小对你来说不够大,那么我不知道是什么。只是为了比较,普通人体内大约有 7e+27 个原子,在新冠病毒封锁之后可能会更多,因为人们在吃饭而不是进行运动。:) 所以你可以计算这个星球上所有人的所有原子(比如说总共有不到 10e+10 人)。但是您需要为这项任务购买一台更大的计算机。

因此,如果您决定采用这种方式,那么您可以轻松地将其覆盖QAbstractTableModel并显示在QTableView. 当然,你不能将底层数据保存在二维数组中,因为你没有足够的内存。但是您必须选择其他方法。例如,QHash<QPoint, QString>whereQPoint将表示坐标, QString 表示值(当然,您可以选择任何其他类型而不是字符串)。然后,当您想要获取给定坐标的值时,您只需在哈希表中查找该值。您能够保存的数据点数量仅取决于您的内存大小。这个解决方案很简单,我猜大概有 30 行代码,不会更多。

于 2021-07-15T20:24:58.000 回答