WebページがロードされたときにQtWebKitを使用するときに知ってどのように?
-
19-09-2019 - |
質問
QWebFrame
とQWebPage
両方がウェブページが完全にロードされたときに検出するために使用することができる信号をvoid loadFinished(bool ok)
ました。 Webページが非同期でロードされた一部のコンテンツ(AJAX)を持っているときに問題があります。ページが完全にこの場合にはロードされたときに知ってどのように?
解決
私は実際にこれを行っていないが、私はあなたがを考えるのはQNetworkAccessManager
を使用してソリューションを実現できる可能性があります。
あなたは networkAccessManager()の機能を使用してQWebPageからQNetworkAccessManagerを得ることができます。 QNetworkAccessManagerは、ファイルがある時はいつでも解雇された信号完成(QNetworkReply *返信)するを持っていますQWebPageインスタンスによって要求されます。
finished
信号を使用すると、要求を識別するために、作られたオリジナルの要求のコピーを取得することができ、そこから、あなたにQNetworkReplyインスタンスを与えます。
だから、渡されたQNetworkReplyの方法だけでダウンロードが終了し、それはあなたのAjaxリクエストだ場合、あなたがする必要がどのような処理を行うたファイルを把握するを使用して、finished
信号に接続するスロットを作成します。
私の唯一の注意点は、私は前にこれをやったことがないということですので、私はそれがうまくいくことを100%確実ではないんです。
別の方法としては、ページのオブジェクト・モデルにオブジェクトを挿入しても、Ajaxリクエストが完了したときに、あなたのオブジェクトに通知し、いくつかのJavaScriptを挿入するためにQWebFrameのメソッドを使用するのが良いかもしれません。これはそれを行うの少しhackier方法ですが、間違いなく動作するはずです。
EDITます:
2番目のオプションは、私には良さそうです。次のようなワークフローがあります:
QWebFrame :: javascriptWindowObjectCleared()シグナルにスロットを取り付けます。この時点で、次のようなコードを追加するQWebFrame :: evaluateJavascript()を呼び出します。 window.onload =関数(){ページが完全にロードされた//}
あなたがその機能に必要なものは何でもコードを入れてください。あなたは、そのオブジェクトに機能をQWebFrame :: addToJavaScriptWindowObject()を介してページにはQObjectを追加して呼び出すこともできます。ページが完全にロードされたときにこのコードは実行されます。
うまくいけば、この質問に答える!
他のヒント
、それはそれです。それはのの完全にロードされます。あなたはその後、事実の後にいくつかの余分なデータ、ページビューまたは何を得るために、いくつかのJavaScriptを使用することを決定した場合は、この事実は変わりません。
言ったことは、私は疑うあなたがここでやりたいことは、あなたが効果的にあなたが決めた後から(あなたのC ++に「コールバック」を提供する、あなたのページのスクリプトから呼び出すことができ、あなたのビューにQtScriptオブジェクト/インターフェースを公開していますあなたは「完全にロード」を持ってきたページのスクリプト)。
...これはあなたにしようとする方向性を与えるのに役立ちます願っています
特定の要素の負荷を確認するために、あなたは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"
OPは、それが遅れてAJAXリクエストによるものだと思ったが、またの非常にの短い時間遅延が問題を修正する理由。また、説明する別の理由があるかもしれません説明した動作の原因となるバグがあります:
https://bugreports.qt-project.org/browse/QTBUG-37377 >
loadingFinished()信号がキューに入れられた接続を使用して接続する必要があり、この問題を回避する。