在 QTreeView 中异步加载数据
Loading data in QTreeView async
我有一个非常大的树结构,我无法在客户端将完整的树加载到 Ram 中。我正在使用 Qt 的 QTreeView。
我想在用户展开元素时动态加载项目的子元素。
是否有一些信号会在用户打开树中的项目时触发?
我正在使用教程 Simple Tree Model Example。当我对模型进行更改时,视图也必须更新。而且我不想失去焦点以避免用户混淆!
一段时间后(请求服务器)...
您需要实现 QAbstractItemModel
的子类来处理所需的数据量。当一个项目在视图中展开时,它会调用 QAbstractItemModel::rowCount
来确定子项计数,然后调用 QAbstractItemModel::flags
和 QAbstractItemModel::data
来获取子项数据。如果请求的数据目前不可用,您应该 return 占位符数据(即 1 行包含 "Loading"),然后开始请求。收到数据后,发出 rowsAboutToBeInserted
和 rowsInserted
信号以通知视图有关新数据的信息(您还应该通知它有关删除 "Loading" 行)。然后视图将再次调用 rowCount
、data
和 flags
方法,您的模型现在应该提供加载的数据。使用 QCache
将最后访问的数据保存在内存中。
我有一个非常大的树结构,我无法在客户端将完整的树加载到 Ram 中。我正在使用 Qt 的 QTreeView。
我想在用户展开元素时动态加载项目的子元素。
是否有一些信号会在用户打开树中的项目时触发?
我正在使用教程 Simple Tree Model Example。当我对模型进行更改时,视图也必须更新。而且我不想失去焦点以避免用户混淆!
一段时间后(请求服务器)...
您需要实现 QAbstractItemModel
的子类来处理所需的数据量。当一个项目在视图中展开时,它会调用 QAbstractItemModel::rowCount
来确定子项计数,然后调用 QAbstractItemModel::flags
和 QAbstractItemModel::data
来获取子项数据。如果请求的数据目前不可用,您应该 return 占位符数据(即 1 行包含 "Loading"),然后开始请求。收到数据后,发出 rowsAboutToBeInserted
和 rowsInserted
信号以通知视图有关新数据的信息(您还应该通知它有关删除 "Loading" 行)。然后视图将再次调用 rowCount
、data
和 flags
方法,您的模型现在应该提供加载的数据。使用 QCache
将最后访问的数据保存在内存中。