2017-12-10 11 views
0

次のコードスニペットはPySideで動作し、PySide2で動作するように翻訳する必要があります。クリックされたとき 目的は、システムブラウザで開くようにすべてのリンクを強制することです(ウィジェットがそれらをロードしようとしているのではなく):しかしQWebEngineView - システムブラウザでリンクを開く方法

from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage 

class HtmlView(QWebEngineView): 

    def __init__(self, parent=None): 
     super(HtmlView, self).__init__(parent) 
     self.page().setLinkDelegationPolicy(QWebEnginePage.DelegateAllLinks) # not working in PySide2 
     self.linkClicked.connect(self.openWebsite) # not working in PySide2 

from PySide.QtWebKit import QWebView, QWebPage 

class HtmlView(QWebView): 

    def __init__(self, parent=None): 
     super(HtmlView, self).__init__(parent) 
     self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) # not working in PySide2 
     self.linkClicked.connect(self.openWebsite) # not working in PySide2 

これは、翻訳の私の試みでした、QWebEngineView .linkClickedは存在しません。QWebEngineView .setLinkDelegationPolicyまたは QWebEnginePage .DelegateAllLinks。

上記を除いてPySide2でこれを達成する最も良い方法は何ですか?

編集:トリガーされたQEventsをチェックしましたが、リンクがクリックされたときにイベントが発生しないようですので、PySide/Qt4.8のlinkClickedイベントはありません。あなたはacceptNavigationRequestを使用する必要が

おかげで、 率直

答えて

1

この関数は、指定されたナビゲーション・タイプの種類によって 指定されたURLに移動するための要求を受信したときに呼ばれます。 isMainFrameは、要求がメインの フレームまたは子フレームに対応するかどうかを示します。関数がtrueを返す場合、ナビゲーション 要求が受け入れられ、urlがロードされます。デフォルトの実装 は、すべてのナビゲーション要求を受け入れます。あなたのケースでは

私はちょうどここで別のポストに同じ情報に出くわし、拒否し、タイプがQWebEnginePage::NavigationTypeLinkClicked.

from PySide2.QtCore import QUrl 
from PySide2.QtGui import QDesktopServices 
from PySide2.QtWidgets import QApplication 
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage 


class WebEnginePage(QWebEnginePage): 
    def acceptNavigationRequest(self, url, _type, isMainFrame): 
     if _type == QWebEnginePage.NavigationTypeLinkClicked: 
      QDesktopServices.openUrl(url); 
      return False 
     return True 

class HtmlView(QWebEngineView): 
    def __init__(self, *args, **kwargs): 
     QWebEngineView.__init__(self, *args, **kwargs) 
     self.setPage(WebEnginePage(self)) 

if __name__ == '__main__': 
    import sys 

    app = QApplication(sys.argv) 
    w = HtmlView() 
    w.load(QUrl("https://stackoverflow.com/questions/47736408/pyside2-qwebview-how-to-open-links-in-system-browser")); 
    w.show() 
    sys.exit(app.exec_()) 
+0

華麗なときに、URLを開く必要があります。 私が忘れていたことの1つ:(絶対的なリンクだけでなく、相対的なリンクも働かせるために)URLのコンテキストで開くリンクが必要です。私はこれがメインフレームとサブフレームの部分だと思いますか?それを今見て... –

+0

@FrankRueter別の質問ですが、別の投稿を作成してください。私の答えがあなたに役立つなら、それを正しいものとしてマークすることを忘れないでください。 – eyllanesc

+0

@FrankRueterあなたが質問で投稿を作成したので、投稿を作成するときに他の質問にお答えします:P – eyllanesc

関連する問題