将整个文件读取到 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 冻结,因为QStandardItemModel
在appendRow
之后发出更新视图的信号。
或者我应该创建自定义模型并添加方法以仅在整个文件加载到QStandardItemModel
时更新视图? QTableView
有自己的数据容器,它没有与模型同步?有可能/正确的方式吗?
读取新文件时的情况如何?
感谢您的帮助。
【问题讨论】:
您只想从文件中加载数据一次或几次? 是的,不止一个。如果只有一个,我想我可以在 GUI 和读取文件线程之间共享 QStandardItemModel。当我阅读新文件时,我只想用新数据填充模型。每次读取文件时,我都在考虑设置新模型,但我认为这不是很好且有效的解决方案。顺便提一句。在这种情况下如何从旧的 QStandardItemModel 中删除内存? 如果您花 10 秒 将文件读入模型,我猜您的行/列数非常大。我建议不要在QStandardItemModel
中一次加载它们,而是使用QAbstractItemModel
、canFetchMore
、fetchMore
进行一些延迟加载。请注意,这是在加载 large 模型时在 QSqlQueryModel
内部使用的策略。
看看来自Qt的Fetch More Example。
【参考方案1】:
我认为您可以执行以下步骤来解决您的问题:
-
当您需要从文件中加载新数据时,请在
nullptr
中为您的QTableView
设置模型。
用文件中的数据在非主(非 GUI)线程中填充 QStandardItemModel
(此模型是您的 QTableView
的模型)。
在主 (GUI) 线程中使用 QTableView
的数据设置模型。
当然,解决您的问题的最简单方法也可能是向用户显示如下内容:“数据加载,请稍候...”,同时您在主(GUI)线程中的QStandardItemModel
中加载数据。
【讨论】:
以上是关于将整个文件读取到 QStandardItemModel 后更新 QTableView的主要内容,如果未能解决你的问题,请参考以下文章