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

问题描述 投票:0回答:2

根据文档,只有在所有页面元素完成加载后才应发出 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

编辑: 有一个几乎相同的问题,但它已经超过 2 岁了,但仍然没有答案。

python pyqt pyqt4 signals-slots qtwebkit
2个回答
5
投票

每加载一个帧,

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)

3
投票

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

您可能应该创建一个仅触发一次的 onDoneFirst 方法。

© www.soinside.com 2019 - 2024. All rights reserved.