4

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 
  ...
  ...
4

3 に答える 3

1

QEventLoopメソッドと比較して、異なるアプローチと異なる動作があります

Signal を使用して機能をサブクラス化しQWebEngineViewて拡張し、カスタム メソッドを作成できます。load()loadFinishedread_html()

class MyWebView(QWebEngineView):

    def __init__(self, parent):
        super(MyWebView, self).__init__(parent)
        self.html = None

    def read_html(self, url):
        """
        Load url and read webpage content in html
        """
        def read_page():
            def process_html(html):
                self.html = html
            self.page().toHtml(process_html)

        self.load(url)
        self.loadFinished.connect(read_page)

この方法では、イベント ループでページの読み込みが完了するのを待っている間にアプリケーションが停止することはありませんが、ページが読み込まれると、HTML コンテンツにアクセスできます。

class MainWindow(QWidget):
    def __int__(self):
        ...
        self.web_view = MyWebView(self)
        self.web_view.read_html(r'https://www.xingyulei.com/')
        ...
        self.btn.clicked.connect(self.print_html)

    def print_html(self):
        print(self.view.html)
于 2022-01-30T23:02:24.900 に答える