8
votes

Catch Link clics dans qtwebview et ouvert dans le navigateur par défaut

Je ouvre une page dans qtwebview (à Pyqt si cela compte) et je souhaite ouvrir tous les liens dans le navigateur par défaut du système. C'est à dire. Un clic sur un lien ne doit pas changer le site dans le QTwebView, mais il doit l'ouvrir avec le navigateur par défaut. Je veux rendre l'impossible à l'utilisateur de changer le site dans le Qtwebview.

Comment puis-je faire ça?

merci, Albert


0 commentaires

3 Réponses :


9
votes

Cela fait:

import sys, webbrowser
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

app = QApplication(sys.argv)
web = QWebView()

web.load(QUrl("http://www.az2000.de/projects/javascript-project/"))
web.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)


def linkClicked(url): webbrowser.open(str(url.toString()))
web.connect(web, SIGNAL("linkClicked (const QUrl&)"), linkClicked) 


web.show()

sys.exit(app.exec_())


1 commentaires

Merci. Nous pouvons lier le gestionnaire en utilisant de cette manière aussi: web.linkclicked.Connect (self.linkclicked)



1
votes

Exemple mis à jour pour PYQT5 (la magie consiste à ré-implémenter la méthode "AcceptnavigateDeQuest"): XXX


0 commentaires

0
votes

Lorsque vous cliquez sur un lien qui possède l'attribut cible = "_ vide" attribut code>, qt appelle la méthode Creewindow dans qwebenginePage pour créer une nouvelle onglet / nouvelle fenêtre.

La clé est de ré- Implémentez cette méthode pour, au lieu d'ouvrir un nouvel onglet, ouvrez une nouvelle fenêtre de navigateur. P>

class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
    def createWindow(self, _type):
        page = WebEnginePage(self)
        page.urlChanged.connect(self.open_browser)
        return page

    def open_browser(self, url):
        page = self.sender()
        QDesktopServices.openUrl(url)
        page.deleteLater()

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.url = QUrl("https://stackoverflow.com/")
        self.webView = QWebEngineView()
        self.page = WebEnginePage(self.webView)
        self.webView.setPage(self.page)
        self.webView.load(self.url)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    web = MainWindow()
    web.show()
    sys.exit(app.exec_())


0 commentaires