以下代码有效(而且非常简单):
class Scrape(QApplication): def __init__(self): super(Scrape, self).__init__(None) self.webView = QWebView() self.webView.loadFinished.connect(self.loadFinished) def load(self, url): self.webView.load(QUrl(url)) def loadFinished(self): documentElement = self.webView.page().currentFrame().documentElement() myScrape = Scrape() myScrape.load('http://google.com/ncr') myScrape.exec_()
但我真的不明白为什么exec_()需要成为最后一次调用,如果需要那么load()实际上是什么...?如果我需要加载两个网页,那么这有什么用呢?
答案 0 :(得分:2)
exec_
调用启动事件循环。这是调度键盘和鼠标事件,计时器事件以及异步槽调用的地方。
load方法符合您的预期:在视图中设置Url。这不需要处理事件以使其工作。但如果你没有完成exec_
,就没有什么可以处理事件,或者阻止程序刚刚完成和退出。
exec_
方法,如术语“事件循环”所示,循环直到应用程序退出。之后调用的函数在事件循环退出之前不会被调用。
如果你想在程序中“做事”,通常你会在事件驱动的框架内工作。要加载页面,您可能会挂起一个触发事件的按钮,该事件连接到加载不同页面的函数。或者,您可以设置一个计时器,该计时器调用一个从列表中设置Url的函数。
连接信号和插槽的示例(来自here):
# Define a new signal called 'trigger' that has no arguments.
trigger = QtCore.pyqtSignal()
def connect_and_emit_trigger(self):
# Connect the trigger signal to a slot.
self.trigger.connect(self.handle_trigger)
# Emit the signal.
self.trigger.emit()
def handle_trigger(self):
# Show that the slot has been called.
print "trigger signal received"