との両方QWebFrame
に、Web ページが完全にロードされたことを検出するために使用できるシグナルがありますQWebPage
。void loadFinished(bool ok)
問題は、Web ページに非同期 (ajax) でロードされるコンテンツがある場合です。この場合、ページが完全にロードされたことを知るにはどうすればよいですか?
4 に答える
私は実際にこれを行っていませんが、を使用してソリューションを実現できると思いますQNetworkAccessManager
。
networkAccessManager()関数を使用して QWebPage から QNetworkAccessManager を取得できます。QNetworkAccessManager には、ファイルが QWebPage インスタンスによって要求されるたびに発生する終了シグナル( QNetworkReply * reply )があります。
シグナルは、finished
リクエストを識別するために作成された元のリクエストのコピーを取得できる QNetworkReply インスタンスを提供します。
したがって、シグナルにアタッチするスロットを作成しfinished
、渡された QNetworkReply のメソッドを使用して、ダウンロードが完了したばかりのファイルを特定し、それが Ajax リクエストである場合は、必要な処理を行います。
私の唯一の注意点は、これまでにこれを行ったことがないということです。したがって、それが機能するかどうかは 100% 確信が持てません。
別の方法として、QWebFrame のメソッドを使用してオブジェクトをページのオブジェクト モデルに挿入し、JavaScript を挿入して、Ajax 要求が完了したときにオブジェクトに通知することもできます。これはややハックな方法ですが、確実に機能するはずです。
編集:
2番目のオプションは私には良いようです。ワークフローは次のとおりです。
スロットを QWebFrame::javascriptWindowObjectCleared() シグナルにアタッチします。この時点で、QWebFrame::evaluateJavascript() を呼び出して、次のようなコードを追加します。 window.onload = function() { // ページが完全にロードされました }
その関数に必要なコードを入れます。QWebFrame::addToJavaScriptWindowObject() を介して QObject をページに追加し、そのオブジェクトで関数を呼び出したい場合があります。このコードは、ページが完全に読み込まれたときにのみ実行されます。
うまくいけば、これは質問に答えます!
特定の要素の負荷を確認するには、を使用できますQTimer
。Pythonでこのようなもの:
@pyqtSlot()
def on_webView_loadFinished(self):
self.tObject = QTimer()
self.tObject.setInterval(1000)
self.tObject.setSingleShot(True)
self.tObject.timeout.connect(self.on_tObject_timeout)
self.tObject.start()
@pyqtSlot()
def on_tObject_timeout(self):
dElement = self.webView.page().currentFrame().documentElement()
element = dElement.findFirst("css selector")
if element.isNull():
self.tObject.start()
else:
print "Page loaded"
最初の html/images/etc の読み込みが完了したら、それで終わりです。完全にロードされています。この事実は、何らかの javascript を使用して追加のデータ、ページビューなどを後で取得することを決定した場合でも変わりません。
つまり、ここでやりたいことは、ページのスクリプトから呼び出すことができる QtScript オブジェクト/インターフェイスをビューに公開し、決定したら (ページ スクリプトから) C++ に効果的に「コールバック」を提供することです。 「完全にロード」したこと。
これがあなたに試してみる方向性を与えるのに役立つことを願っています...
OPは、AJAXリクエストの遅延が原因であると考えていましたが、非常に短い時間の遅延で問題が解決する理由を説明する別の理由がある可能性もあります. 説明されている動作を引き起こすバグがあります。
https://bugreports.qt-project.org/browse/QTBUG-37377
この問題を回避するには、loadingFinished() シグナルをキュー接続を使用して接続する必要があります。