2017-12-10 5 views
0

Ich habe das folgende Code-Snippet in PySide arbeiten und müssen es in PySide2 arbeiten zu übersetzen. Der Zweck ist es, alle Links zu zwingen, im System-Browser zu öffnen, wenn darauf geklickt (anstatt das Widget zu versuchen, sie zu laden):QWebEngineView - So öffnen Sie Links im Systembrowser

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 

Dies war mein Versuch einer Übersetzung:

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 

jedoch , QWebEngineView .linkClicked existiert nicht und auch nicht QWebEngineView .setLinkDelegationPolicy oder QWebEnginePage .DelegateAllLinks.

Was ist der beste Weg, dies in PySide2 ohne die oben genannten zu erreichen?

Edit: Ich habe die QEvents überprüft, die ausgelöst werden, aber kein Ereignis scheint abgefeuert zu werden, wenn ein Link angeklickt wird, also ohne das linkClicked Ereignis von PySide/Qt4.8 Ich habe keine Ahnung, wie man das einleitet.

Danke, frank

Antwort

1

Sie haben acceptNavigationRequest zu verwenden:

Diese Funktion bei Empfang eine Anforderung aufgerufen wird die angegebene URL mit Hilfe des angegebenen Navigationstyp Art zu navigieren. isMainFrame gibt an, ob die Anfrage dem Haupt- -Rahmen oder einem untergeordneten Rahmen entspricht. Wenn die Funktion wahr zurückgibt, wird die Navigation Anfrage akzeptiert und URL wird geladen. Die Standardimplementierung akzeptiert alle Navigationsanforderungen.

In Ihrem Fall müssen Sie ablehnen und die URL öffnen, wenn der Typ 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

brillant, ich nur über die gleichen Informationen in einem anderen Beitrag hier gestolpert. Eine Sache, die ich vergessen habe: Ich brauche Links, um im Kontext einer bestimmten URL zu öffnen (damit relative Links genauso funktionieren wie absolute Links). Ich nehme an, das ist der Hauptrahmen vs Unterrahmenteil? Schau es dir jetzt an ... –

+0

@FrankRueter Das ist eine andere Frage, erstelle einen anderen Beitrag. Wenn meine Antwort Ihnen hilft, vergessen Sie nicht, sie als richtig zu markieren. – eyllanesc

+0

@FrankRueter In SO erstellen Sie einen Beitrag nach der Frage, ich werde Ihnen in der anderen Frage helfen, wenn Sie den Beitrag erstellen: P – eyllanesc

Verwandte Themen