我试图从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
...
...
感谢您阅读本文。
祝大家过得愉快。
答案 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