我扩展QApplication并在exec_不起作用后调用方法

时间:2010-08-11 04:20:27

标签: python pyqt4

以下代码有效(而且非常简单):

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 个答案:

答案 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"