将整个文件读取到 QStandardItemModel 后更新 QTableView

Posted

技术标签:

【中文标题】将整个文件读取到 QStandardItemModel 后更新 QTableView【英文标题】:Updating QTableView after reading whole file to QStandardItemModel 【发布时间】:2016-08-28 14:22:25 【问题描述】:

我有一些新手问题。我不确定我是否正确理解模型-视图-控制器设计模式。

也许我会从描述我的问题开始。我正在从文件中读取一些数据。这可能需要 10 秒,然后我在表格中显示这些数据。问题是我应该如何存储这些数据?除了QStandardItemModel,我是否应该有另一个容器,我将从文件中读取数据并在其他线程中使用它?例如,我在 Gui 线程中有QStandardItemModel,我创建了另一个容器,比如说QVector。我将数据从文件加载到QVector,然后将数据从QVector 移动到QStandardItemModel

我不能在其他线程中使用QStandardItemModel 并直接从文件读取数据到QStandardItemModel,因为我知道GUI 冻结,因为QStandardItemModelappendRow 之后发出更新视图的信号。

或者我应该创建自定义模型并添加方法以仅在整个文件加载到QStandardItemModel 时更新视图? QTableView 有自己的数据容器,它没有与模型同步?有可能/正确的方式吗?

读取新文件时的情况如何?

感谢您的帮助。

【问题讨论】:

您只想从文件中加载数据一次或几次? 是的,不止一个。如果只有一个,我想我可以在 GUI 和读取文件线程之间共享 QStandardItemModel。当我阅读新文件时,我只想用新数据填充模型。每次读取文件时,我都在考虑设置新模型,但我认为这不是很好且有效的解决方案。顺便提一句。在这种情况下如何从旧的 QStandardItemModel 中删除内存? 如果您花 10 秒 将文件读入模型,我猜您的行/列数非常大。我建议不要在QStandardItemModel 中一次加载它们,而是使用QAbstractItemModelcanFetchMorefetchMore 进行一些延迟加载。请注意,这是在加载 large 模型时在 QSqlQueryModel 内部使用的策略。 看看来自Qt的Fetch More Example。 【参考方案1】:

我认为您可以执行以下步骤来解决您的问题:

    当您需要从文件中加载新数据时,请在nullptr 中为您的QTableView 设置模型。 用文件中的数据在非主(非 GUI)线程中填充 QStandardItemModel(此模型是您的 QTableView 的模型)。 在主 (GUI) 线程中使用 QTableView 的数据设置模型。

当然,解决您的问题的最简单方法也可能是向用户显示如下内容:“数据加载,请稍候...”,同时您在主(GUI)线程中的QStandardItemModel 中加载数据。

【讨论】:

以上是关于将整个文件读取到 QStandardItemModel 后更新 QTableView的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中读取第一行而不将整个文本文件加载到内存中

python 以块的形式读取文件而不将整个文件加载到内存中。

如何读取大的avro文件,并将整个文件加载到内存中。

将文件压缩到内存并以字节python的形式读取整个存档

python没有读取整个文件

从图像文件中提取感兴趣区域而不读取整个图像