1

我使用 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
}

第一个qml.qml

import QtQuick 1.1
import QtWebKit 1.0
WebView {

    id: webView
    objectName: "myWebView"
    url:"http://example.com"
    onLoadFinished: {myAws.clearCacheQMLSlot();}
}
4

1 回答 1

1

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

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

其次,QDeclarativeEngine::clearComponentCache既不是插槽也不是可调用的方法,所以它仍然不起作用。从 QML 调用普通的 C++ 方法是根本不可能的。

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

于 2012-12-21T15:38:24.033 回答