2017-11-02 9 views
0

私はQWebEnginePageオブジェクトからHTMLコードを取得しようとしています。 Qtリファレンスによると、QWebEnginePageオブジェクトの 'toHtml'は以下のような非同期メソッドです。(PyQt5.9)QWebEnginePageのオブジェクトであるメソッド 'toHtml'を同期的に呼び出す方法はありますか?

非同期方法は、HTMLおよびBODYタグで囲まれたHTMLとしてページのコンテンツを、取得します。正常終了すると、ページの内容とともに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

これがなぜ必要なのかはっきりしていません。 QWebEngineはBlinkに基づいています。これは、最新のブラウザと同様に、Webコンテンツ用の別のプロセスを実行します。プロセス間のIPC呼び出しに時間がかかることがあるため、QWebEngineはコールバック関数を定義して、 IPCコールは完了します。だからこの質問の正当性を知らずに、可能な限り最善の答えを提供することは暗闇の中で刺すだろう。 – MrEricSir

+0

@MrEricSir QWebEngineがBlinkフレームワークのベースであることについて私は知らなかった。私はちょうど私が作成したいくつかのボタンを使用してhtml応答delievered後にWebビューの画面のコンテンツを変換したい。あなたのお返事ありがとうございます。 –

答えて

0

その動作を取得する簡単な方法は、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_()) 
+0

ありがとうございました。あなたの答えは私にとって非常に役に立ちます。良い一日を過ごしてください! –

関連する問題