从 QML 中清除 WebView 缓存



我用QDeclarativeView打开网站,并使用JavaScript在同一视图中加载下一页。

每个网站加载后,我的程序会多占用 20mb 的内存。加载新网站后,如何清理缓存或以其他方式释放内存?

我试过了:

decView->engine()->rootContext()->setContextProperty("myEngine", decView->engine());

然后在 QML 中

myEngine.clearComponentCache()

但我得到

TypeError: 表达式 'myEngine.clearComponentCache' [undefined] 的结果不是函数。

我应该怎么做?

编辑:这是我到目前为止得到的:
aws.cpp

void Aws::openQMLWindowSlot(){
QDeclarativeView *decView= new QDeclarativeView();
decView->engine()->rootContext()->setContextProperty("myAws",this);
decView->setSource(QUrl("qrc:/inc/firstqml.qml"));
decView->show();
}
void Aws::clearCacheQMLSlot(){
//HERE I GOT PROBLEM
}

FirstQML.qml

import QtQuick 1.1
import QtWebKit 1.0
WebView {
id: webView
objectName: "myWebView"
url:"http://example.com"
onLoadFinished: {myAws.clearCacheQMLSlot();}
}

代码无法按预期工作的原因有两个。首先,为了能够访问QObject后代的插槽和可调用方法,您必须注册它们:

qmlRegisterType<QDeclarativeEngine>("MyApp", 1, 0, "QDeclarativeEngine");

其次,QDeclarativeEngine::clearComponentCache既不是插槽也不是可调用的方法,因此它仍然不起作用。根本不可能从 QML 调用正常的C++方法。

您实际要做的是实现一个自己的基于QObject的类,将QDeclarativeEngine::clearComponentCache调用包装在插槽中,像上面一样注册类,将该类的实例设置为上下文属性,就像您使用声明式引擎所做的那样,最后从 QML 调用该插槽。

最新更新