从 QML 中清除 WebView 缓存
Clearing WebView Cache from withing QML
我用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 调用该插槽。
相关文章:
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- 如何使缓存线程安全
- 存储指令是否会阻止缓存未命中的后续指令?
- 缓存局部性与函数调用
- Qt 网页程序集缓存
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- std::shared_ptr vs std::make_shared:意外的缓存未命中和分支预测
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- 无法链接 LRU 缓存C++
- 空函数的参数是否加载到缓存中?
- 是否可以检查变量是否位于 L1/L2/L3 缓存中
- dynamic_cast每次调用是否比具有空检查的缓存变量更昂贵?
- C++:如何在从给定缓存中排除数字的同时生成随机数
- 如何对0,1,..中的k个随机数进行采样..,n-1,而不缓存到数组
- 缓存大量回调,然后批量调用它们,无需v表成本
- 从 QML 中清除 WebView 缓存