QAbstractItemModel惰性加载锁定应用程序

问题描述:

我已经实现了canFetchMore,hasChildren和fetchMore以允许我的模型被延迟加载。这是非常简单的,基于QT的:http://doc.qt.io/archives/qt-4.7/itemviews-simpletreemodel.htmlQAbstractItemModel惰性加载锁定应用程序

我的问题是,在我的应用程序获取儿童不是一个非常快速的操作,它涉及到服务器端的延迟几秒钟,而它会计算出谁是儿童实际上。

我不确定该如何处理。每次有人展开节点时,我都无法将应用程序锁定几秒钟。我不知道如何去做这件事发生在后台。如果我要创建一个子进程或线程来实际完成检索子进程和更新客户端数据结构的工作,那么我将如何去告诉模型已经成功完成了这个模型(并且为了最终展开节点) 。

另外,有没有办法显示节点当前正在加载数据的过程中?

道歉,如果这些都是愚蠢的问题,GUI编程对我来说仍然是一个谜,我从来没有使用过QT。

为了记录,我使用Python,但如果在C++中给出答案,我可以理解它们。

感谢

如果我是 创建子进程或线程完成检索 孩子和更新客户端数据结构的工作中,我将如何 去告诉模型这已经成功完成(并且 为节点终于展开)。

您可以使用信号和插槽。在线程中,您将检索数据,您将发出一个自定义信号,如someDataAvailable(YourdataType),然后在gui中,您将使用类似handleDataReadySignal(YourdataType)的插槽处理此信号。信号通过发射时您给予的物体。显然你需要更新gui和handleDataReadySignal插槽中的列表。当然你需要connect插槽的信号,最好在窗口/对话框的列表附加的构造函数

+0

所以你不会使用fetchmore来添加项目,但用它来发出信号。该信号在另一个线程中导致数据收集,然后它向GUI发出一个信号。然后,GUI使用insertRow插入行(这实际上并未填充或初始化项目),然后使用setData将实际数据输入到该行。如果是这样,从辅助线程返回时如何在正确的位置添加项目?根据文件,索引不应该被传递,因为它们可能会改变,并且没有办法根据实际的数据项目来查找索引。 – dpwrussell 2012-07-12 15:17:20

+0

好吧,也许对于这种情况,您可能需要使用索引来定位新到物品的放置位置。只要尝试这种方式,如果它的工作,然后寻求一种方法来实现这一点,而不通过索引。 – destan 2012-07-13 13:46:08