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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top