为什么在某些网站上多次调用QWebView.loadFinished,例如YouTube吗?

时间:2012-01-08 03:25:52

标签: python pyqt pyqt4 qtwebkit

根据文档,只有在所有页面元素完成加载后才应发出loadFinished。这应该意味着它只会被调用一次,但是我注意到在像youtube.com这样的网站上,它会被调用两次?有没有其他方法可以解决这个 bug 或者最可靠的方法来检测page.load事件?

这是测试代码:

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_())

输出:

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

编辑: 有一个几乎相同的question但它的> 2岁,仍然没有答案。

2 个答案:

答案 0 :(得分:4)

为每个加载的帧触发load*个信号。

要仅捕获第一组信号,请连接到主帧的相应信号:

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

您可以通过连接frameCreated信号验证是否正在加载其他帧,该信号将在主帧加载后创建的每个后续帧中触发一次:

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

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

答案 1 :(得分:3)

我很确定在修改DOM时会发生这种情况,就像它是一个字符串一样。我确信QWebKit运行JS代码,因此它可以在onDone()之后修改DOM。

你应该创建一个只触发一次的onDoneFirst方法。