qtwebkit을 사용할 때 웹 페이지가로드되는시기를 아는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1302874

문제

둘 다 QWebFrame 그리고 QWebPage 가지다 void loadFinished(bool ok) 웹 페이지가 완전히로드 될 때 감지하는 데 사용할 수있는 신호. 문제는 웹 페이지에 일부 컨텐츠가 비동기식으로로드 된 경우 (AJAX)입니다. 이 경우 페이지가 완전히로드되는시기를 아는 방법은 무엇입니까?

도움이 되었습니까?

해결책

나는 실제로 이것을하지 않았지만 나는 당신을 생각합니다 5월 솔루션을 사용하여 달성 할 수 있습니다 QNetworkAccessManager.

Qwebpage에서 Qnetworkaccessmanager를 NetworkAccessManager () 기능. QNETWORKACCESSMANAGER에는 신호가 있습니다 완성 (qnetworkeply * 답장) QwebPage 인스턴스에서 파일을 요청할 때마다 발사됩니다.

그만큼 finished Signal은 요청을 식별하기 위해 원래 요청의 사본을 얻을 수있는 QnetworkReply 인스턴스를 제공합니다.

따라서 부착 할 슬롯을 만듭니다 finished 신호, 전달 된 Qnetworkreply의 메소드를 사용하여 다운로드가 완료된 파일을 파악하고 AJAX 요청이라면 필요한 처리를 수행하십시오.

나의 유일한 경고는 내가 전에 이것을 한 적이 없다는 것입니다. 그래서 나는 그것이 효과가 있다고 확신하지 못한다는 것입니다.

또 다른 대안은 QwebFrame의 메소드를 사용하여 페이지의 객체 모델에 객체를 삽입하고 일부 JavaScript를 삽입하여 AJAX 요청이 완료되면 객체에 알립니다. 이것은 약간 해킹하는 방법이지만 확실히 작동해야합니다.

편집하다:

두 번째 옵션은 나에게 더 나은 것 같습니다. 워크 플로는 다음과 같습니다.

qwebframe :: javaScriptWindowObjectCleared () 신호에 슬롯을 부착하십시오. 이 시점에서 qwebframe :: EvaluateJavaScript ()에 전화하여 다음과 유사한 코드를 추가하십시오. Window.onload = function () {// page가 완전히로드되었습니다}

해당 기능에 필요한 코드를 넣으십시오. qwebframe :: addToJavaScriptWindowObject ()를 통해 페이지에 qobject를 추가 한 다음 해당 객체에서 함수를 호출 할 수 있습니다. 이 코드는 페이지가 완전히로드 된 경우에만 실행됩니다.

바라건대 이것은 질문에 대답합니다!

다른 팁

초기 HTML/Images/etc가로드가 완료되면 그게 다행입니다. 그것 ~이다 완전히로드. 이 사실은 JavaScript를 사용하여 추가 데이터, 페이지보기 등을 얻기로 결정한 경우 변경되지 않습니다.

즉, 여기서 내가하고 싶은 것은 페이지의 스크립트에서 호출 할 수 있다는 QTScript 객체/인터페이스를 노출시키는 것입니다. 당신은 "완전히로드"했다.

이것이 당신에게 시도 할 방향을 제시하는 데 도움이되기를 바랍니다 ...

특정 요소의 부하를 확인하려면 QTimer. 파이썬에서 이와 같은 것 :

@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

이 문제를 해결하려면로드 피니쉬 () 신호를 대기열 연결을 사용하여 연결해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top