【发布时间】:2019-07-04 17:27:02
【问题描述】:
我有 QML ListView 和一些由上下文属性提供的模型(QList<QObject*>):
g->appEngine->rootContext()->setContextProperty("queueStatesModel", QVariant::fromValue(this->queueStates));
在我尝试清除 ListView 之前一切顺利。我就是这样做的:
qDeleteAll(this->queueStates);
this->queueStates.clear();
然后我再次使用空 QList 设置上下文属性,这会导致应用程序崩溃。当我在不删除所有对象的情况下使用 qDeleteAll 一切顺利时,ListView 很清晰,应用程序没有崩溃,但对象仍然存在,我失去了指向它们的指针。
这有什么问题?
【问题讨论】:
-
我想重新创建列表以仅清除视图是错误的想法。您必须改为使用队列数据进行操作。最好的方法是实现自定义 QAbstractItemModel 模型。
-
@folibis 感谢您的回复。我知道您在想什么,但文档说:“视图无法知道 QList 的内容已更改。如果 QList 更改,则有必要通过调用 QQmlContext 重置模型::setContextProperty() 再次。”所以如果有这种可能,我认为删除对象并重置上下文属性以清除视图没有任何问题。
-
也许,也许……但是您会发现这种方法会导致问题。例如,在清除列表和重置属性之间应该发生什么?例如,如果
ListView将在此时重新绘制其内容并调用 queueStatesModel.at(1) 会怎样? -
@folibis 你是绝对正确的,但在我的情况下,实现 QAbstractItemModel 可能有点夸大其词,现在 QList 就足够了 - 数据源是 SOAP API,我不需要刷新对象,我只需要在请求期间显示一次。我找到了解决方案,我会写在下面。