我扩展了QApplication,但exec_后调用方法无效
下面的代码可以正常运行(而且非常简单):
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()到底是干什么的呢?如果我需要加载,比如说,两张网页,这一切又是怎么工作的呢?
1 个回答
2
exec_
这个调用是用来启动事件循环的。在这个循环中,键盘和鼠标的操作、定时器事件,还有异步的槽函数调用都会被处理。
load方法的作用就是你想的那样:在视图中设置一个网址。这个操作不需要处理事件就能完成。但是如果你不使用exec_
,那么就没有东西来处理这些事件,程序可能会直接结束并退出。
exec_
方法,顾名思义,就是一个事件循环,它会一直运行,直到应用程序退出。在这之后调用的函数,直到事件循环结束之前都不会被执行。
如果你想在程序中“做事情”,通常需要在事件驱动的框架内工作。比如说,要加载页面,你可以连接一个按钮,这个按钮会触发一个事件,然后这个事件会调用一个加载不同页面的函数。或者,你可以设置一个定时器,定时调用一个函数,从列表中设置网址。
下面是连接信号和槽的一个例子(来自这里):
# 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"