【问题标题】:Qt QML application crashes when QList objects in context property are deleted删除上下文属性中的 QList 对象时,Qt QML 应用程序崩溃
【发布时间】: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,我不需要刷新对象,我只需要在请求期间显示一次。我找到了解决方案,我会写在下面。

标签: c++ qt qml


【解决方案1】:

我找到了一些解决方案 - 不是很优雅但很有效。

QList::clear() 之前,我将指针从该列表复制到另一个QList。然后我clear()首先列出并设置上下文属性。之后,我在第二个列表中执行 qDeleteAllclear()。或多或少是这样的:

this->queueStatesCache = this->queueStates;
this->queueStates.clear();
g->appEngine->rootContext()->setContextProperty("queueStatesModel", QVariant::fromValue(this->queueStates));
qDeleteAll(this->queueStatesCache);
this->queueStatesCache.clear();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多