我扩展了QApplication,但exec_后调用方法无效

2 投票
1 回答
708 浏览
提问于 2025-04-16 02:37

下面的代码可以正常运行(而且非常简单):

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"

撰写回答