Como saber quando uma página da web é carregada ao usar o QTWebkit?
-
19-09-2019 - |
Pergunta
Ambos QWebFrame
e QWebPage
tenho void loadFinished(bool ok)
sinal que pode ser usado para detectar quando uma página da web está completamente carregada. O problema é quando uma página da Web possui algum conteúdo carregado de forma assíncrona (AJAX). Como saber quando a página está completamente carregada neste caso?
Solução
Eu realmente não fiz isso, mas acho que você poderia ser capaz de alcançar sua solução usando QNetworkAccessManager
.
Você pode obter o QNetworkAccessManager do seu QWebPage usando o NetworkAccessManager () função. QNetworkAccessManager tem um sinal acabado (qnetworkreply * resposta) que é disparado sempre que um arquivo é solicitado pela instância do QWebPage.
o finished
O sinal fornece uma instância QNETWORKRYPL, a partir da qual você pode obter uma cópia da solicitação original feita, a fim de identificar a solicitação.
Então, crie um slot para anexar ao finished
Signal, use os métodos do QNETWORKREPLY PASSADO para descobrir qual arquivo acabou de fazer o download e, se for a sua solicitação de Ajax, faça qualquer processamento que você precisar fazer.
Minha única ressalva é que nunca fiz isso antes, então não tenho 100% de certeza de que funcionaria.
Outra alternativa pode ser usar os métodos da QWebframe para inserir objetos no modelo de objeto da página e também inserir algum JavaScript que notifique seu objeto quando a solicitação AJAX estiver concluída. Esta é uma maneira um pouco mais invadida de fazê -lo, mas definitivamente deve funcionar.
EDITAR:
A segunda opção me parece melhor. O fluxo de trabalho é o seguinte:
Anexe um slot ao QWebframe :: javascriptwindowObjectcleared () sinal. Neste ponto, ligue para QWebframe :: avaliarjavascript () para adicionar código semelhante ao seguinte: window.onload = function () {// página tem totalmente carregado}
Coloque o código que você precisa nessa função. Você pode querer adicionar um qObject à página via qwebframe :: addTojavScriptWindowObject () e depois chamar uma função nesse objeto. Este código será executado apenas quando a página estiver totalmente carregada.
Espero que isso responda à pergunta!
Outras dicas
Quando o seu html/imagens/etc inicial termina o carregamento, é isso. Isto é completamente carregado. Esse fato não muda se você decidir usar algum JavaScript para obter alguns dados extras, visualizações de página ou qualquer outra coisa após o fato.
Dito isto, o que eu suspeito que você queira fazer aqui é expor um objeto/interface QTScript para sua visão de que você pode invocar do script da sua página, fornecendo efetivamente um "retorno de chamada" no seu C ++ depois de decidir (do script da página) que você "completamente carregado".
Espero que isso ajude a dar uma direção para tentar ...
Para verificar a carga de elemento específico, você pode usar um QTimer
. Algo assim em 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"
O pensamento de OP foi devido a pedidos de Ajax atrasados, mas também poderia haver outra razão que também explica por que um muito Atraso de curto período de tempo corrige o problema. Há um bug que causa o comportamento descrito:
https://bugreports.qt-project.org/browse/qtbug-37377
Para contornar esse problema, o sinal de carregamento () deve ser conectado usando a conexão na fila.