Я расширяю QApplication и вызываю метод после exec_ не работает - PullRequest
0 голосов
/ 11 августа 2010

Следующий код работает (и он очень прост):

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 голосов
/ 11 августа 2010

Вызов exec_ запускает цикл обработки событий.Именно сюда отправляются события клавиатуры и мыши, события таймера, а также асинхронные вызовы слотов.

Метод load делает то, что вы ожидаете: устанавливает URL в представлении.Для этого не нужно обрабатывать события.Но если вы не закончите с exec_, то не будет ничего, чтобы иметь дело с событиями или препятствовать тому, чтобы программа просто заканчивала и выходила.

Метод exec_, как термин 'событие'loop 'указывает, циклы, пока приложение не закроется.Функции, вызываемые после этого, не будут вызываться до тех пор, пока не завершится цикл обработки событий.

Если вы хотите «что-то делать» в своей программе, обычно вы работаете в рамках событийно-управляемой среды.Чтобы загрузить страницы, вы можете подключить кнопку, которая будет запускать событие, которая связана с функцией, которая загружает другую страницу.Или вы можете настроить таймер, который вызывает функцию, которая устанавливает URL-адрес из списка.

Пример подключения сигналов и слотов (от здесь ):

# 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"
...