2012-01-08 5 views
5

Zgodnie z dokumentacją loadFinished powinien być emitowany dopiero po zakończeniu ładowania wszystkich elementów strony. To powinno oznaczać, że zostanie wywołane tylko raz, jednak zauważyłem, że w niektórych witrynach, takich jak youtube.com, jest wywoływana dwa razy? Czy istnieje inny sposób obejścia tego błędu lub jaki jest najbardziej niezawodny sposób wykrywania zdarzenia page.load?Dlaczego QWebView.loadFinished jest wywoływany kilka razy w niektórych witrynach, np. youtube?

Oto kod testu:

import sys 
from PyQt4 import QtCore, QtGui, QtWebKit 
from PyQt4.QtCore import QUrl 
from PyQt4.QtGui import QApplication 

def onDone(val): 
    print "Done ...",val 

def onStart(): 
    print "Started..." 

app = QApplication(sys.argv) 
ui = QtWebKit.QWebView() 
ui.loadStarted.connect(onStart) 
ui.loadFinished.connect(onDone) 

ui.load(QUrl("http://www.youtube.com")) 
ui.showMaximized() 
sys.exit(app.exec_()) 

Wyjście:

Started... 
Done ... True 
Started... 
Done ... True 

Edit: Jest prawie takie same, ale jego question> 2yrs stary i nadal bez odpowiedzi.

+0

Jestem pewien, że dzieje się podczas modyfikowania DOM jak gdyby był to ciąg. –

+0

Wysłałem kod. W jaki sposób DOM zmienia się w tym? Proste ładowanie adresu URL, prawda? –

+1

Jestem pewien, że QWebKit uruchamia kod JS, więc może zmodyfikować DOM po tym, jak był on na Done(). To jest komentarz, a nie odpowiedź. –

Odpowiedz

4

Sygnały są uruchamiane tylko raz dla każdej załadowanej klatki.

Aby uchwycić tylko pierwszy zestaw sygnałów łączą się z odpowiednimi sygnałami ramy głównej:

ui.page().mainFrame().loadStarted.connect(onStart) 
ui.page().mainFrame().loadFinished.connect(onDone) 

można sprawdzić, czy pozostałe ramki są ładowane przez połączenie sygnału frameCreated, które będą uruchamiane po dla każdego późniejsze ramy utworzonej po głównym rama została załadowana:

def onFrame(val): 
    print 'Frame Created:', val.frameName() 

ui.page().frameCreated.connect(onFrame) 
+0

Dzięki za twoje ans. Istnieje jednak wątpliwość (nie w systemie, więc nie mogę sprawdzić siebie) - czy QWebFrame utrzymuje się poza czasem renderowania strony? Miałem wrażenie, że ramka jest tworzona dla każdej ramki witryny i powinna zostać zniszczona zaraz po załadowaniu następnej strony. Wybacz mój brak wglądu, ale jestem raczej nowy do qt. –

+1

@ Codefreak. Jeśli pytasz, czy musisz odłączyć i ponownie podłączyć sygnały przed załadowaniem nowej strony, odpowiedź brzmi: nie. Zauważ też, że zawsze istnieje obiekt 'mainFrame', niezależnie od tego, czy strona ma jakieś znaczniki' 'lub''. – ekhumoro

+0

Yup to dokładnie to, co chciałem wiedzieć. Dzięki za informację. –

3

Jestem całkiem pewien, że dzieje się, gdy modyfikujesz DOM, tak jakby był ciągiem. Jestem pewien, że QWebKit uruchamia kod JS, więc może zmodyfikować DOM po tym, jak był on na Done().

Najprawdopodobniej powinieneś stworzyć metodę onDoneFirst, która uruchamia się tylko jeden raz.

+0

Będę czekać 24 godzin na lepszą odpowiedź. W przypadku, gdy nie otrzymam żadnego, przyjmuję twoją odpowiedź. –

+0

Możesz zmienić zaakceptowaną odpowiedź, jeśli lepsza odpowiedź zostanie wysłana później. Jeśli odpowiedź była pomocna, zachęcamy do przegłosowania. Proszę odnieść się do http://stackoverflow.com/privileges/vote-up i http://stackoverflow.com/privileges/create-posts –

Powiązane problemy