有没有办法同步调用方法' toHtml'哪个是QWebEnginePage的对象?

时间:2017-11-02 03:20:07

标签: python pyqt pyqt5 qwebengineview qwebenginepage

我试图从QWebEnginePage对象中获取HTML代码。根据Qt参考,QWebEnginePage对象' toHtml'是异步方法,如下所示。

  

异步方法,将网页内容检索为HTML,并附在HTML和BODY标记中。成功完成后,将使用页面内容调用resultCallback。

所以我试着找出如何同步调用这个方法。

我想得到的结果如下。

class MainWindow(QWidget):
  html = None
  ...
  ...
  def store_html(self, data):
    self.html = data

  def get_html(self):
    current_page = self.web_view.page()
    current_page.toHtml(self.store_html)
    # I want to wait until the 'store_html' method is finished
    # but the 'toHtml' is called asynchronously, return None when try to return self.html value like below.
    return self.html 
  ...
  ...

感谢您阅读本文。

祝大家过得愉快。

2 个答案:

答案 0 :(得分:1)

获得该行为的一种简单方法是使用QEventLoop()。此类的对象可防止执行exec_()之后的代码,这并不意味着GUI不会继续工作。

class Widget(QWidget):
    toHtmlFinished = pyqtSignal()

    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.setLayout(QVBoxLayout())
        self.web_view = QWebEngineView(self)
        self.web_view.load(QUrl("http://doc.qt.io/qt-5/qeventloop.html"))
        btn = QPushButton("Get HTML", self)
        self.layout().addWidget(self.web_view)
        self.layout().addWidget(btn)
        btn.clicked.connect(self.get_html)
        self.html = ""

    def store_html(self, html):
        self.html = html
        self.toHtmlFinished.emit()

    def get_html(self):
        current_page = self.web_view.page()
        current_page.toHtml(self.store_html)
        loop = QEventLoop()
        self.toHtmlFinished.connect(loop.quit)
        loop.exec_()
        print(self.html)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

答案 1 :(得分:0)

您可以使用在multiprocessing.Pipe的send方法的一侧创建的multiprocessing.Connection对象作为回调,然后在此之后立即使用管道的recv方法的另一端。 Recv将一直阻塞,直到接收到html,因此请记住

示例:

Mailable