【发布时间】: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。
标签: c++ multithreading qt qtableview qstandarditemmodel