1

QDeclarativeView で Web サイトを開き、JavaScript を使用して同じビューで次のページを読み込みます。

各 Web サイトが読み込まれた後、私のプログラムはさらに 20 MB のメモリを占有します。新しい Web サイトが読み込まれた後、キャッシュを消去するか、メモリを解放するにはどうすればよいですか?

私は試した:

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

そしてqmlで

myEngine.clearComponentCache()

しかし、私は得る

TypeError: 式 'myEngine.clearComponentCache' [未定義] の結果は関数ではありません。

どうすればいいですか?

編集:これが私がソファーを得たものです:
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

コードが意図したとおりに機能しない理由は 2 つあります。QObjectまず、子孫のスロットと呼び出し可能なメソッドにアクセスできるようにするには、それらを登録する必要があります。

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

次に、QDeclarativeEngine::clearComponentCacheスロットでも呼び出し可能なメソッドでもないため、それでも機能しません。QML から通常の C++ メソッドを呼び出すことはまったく不可能です。

実際に行う必要があるのはQObject、呼び出しをスロットにラップする独自のクラスを実装しQDeclarativeEngine::clearComponentCache、上記のようにクラスを登録し、宣言エンジンで行ったようにそのクラスのインスタンスをコンテキスト プロパティとして設定し、最後にスロットを呼び出すことです。 QML。

于 2012-12-21T15:38:24.033 に答える