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