模型上的 QT 无限视图

QT infinite view on model

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

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

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

所以我的问题是 - 如果甚至可以在没有填充空数据的模型的情况下显示 'ghost cells',如何使用 QT model/view 编程来实现?如果我能简要解释一下 excel 等

等应用程序是如何完成的,那就太好了

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

但我认为你应该选择一些足够大的数字来定义最大值。它可能是一个非常大的数字......如果你在 64 位机器上,那么你的 'infinite' table 可以有 9,223,372,036,854,775,807 行和相同数量的列。这个大数恰好是有符号64位的最大值int。而int用于在QAbstractItemModel中与QModelIndex进行索引。所以你的二维'Excel'table总共可以有8.5070592e+37个单元格。如果这个 table 尺寸对你来说不够大,那么我不知道是什么。只是为了比较,平均人体中大约有 7e+27 个原子,在 covid 锁定之后可能会更多一些,因为人们正在吃东西而不是进行运动。 :) 所以你可以计算这个星球上所有人的所有原子(假设总共有不到 10e+10 个人)。但是你需要买更大一点的电脑来完成这个任务。

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