1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import os
from PyQt5 import QtWidgets, QtCore, QtWebEngineWidgets
##############################################################################
class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
"""Nécessaire pour permettre à un lien hypertexte d'afficher une nouvelle
page dans la même fenêtre
Voir ici:
https://stackoverflow.com/questions/54920726/how-make-any-link-blank-open-in-same-window-using-qwebengine
"""
#=========================================================================
def __init__(self, parent=None):
super().__init__(parent)
#=========================================================================
def createWindow(self, _type):
page = WebEnginePage(self)
page.urlChanged.connect(self.on_url_changed)
return page
#=========================================================================
def on_url_changed(self, url):
page = self.sender()
self.setUrl(url)
page.deleteLater()
#############################################################################
class AideHtml(QtWidgets.QWidget):
#========================================================================
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Aide")
self.resize(1000, 600)
# crée l'afficheur de page html
self.view = QtWebEngineWidgets.QWebEngineView()
# positionne la page html dans la fenêtre
self.layout = QtWidgets.QGridLayout(self)
self.layout.addWidget(self.view)
self.setLayout(self.layout)
# prépare le chargement de la page
self.page = WebEnginePage(self.view) # => QWebEnginePage personnalisé
self.view.setPage(self.page)
#========================================================================
def affichepage(self, url, ancre=None):
"""affiche la page d'adresse 'url' (ancre possible si != de None)
url peut être un fichier html local ou une adresse web
"""
# définit si c'est une page locale ou non
if os.path.exists(url):
# => c'est un fichier local
qurl = QtCore.QUrl.fromLocalFile(url)
else:
# => c'est une adresse web
qurl = QtCore.QUrl(url)
# charge la page
self.page.setUrl(qurl)
self.view.setPage(self.page)
# injecte du javascript pour accéder, si demandé, à une ancre de la page
if ancre!=None:
# crée un QWebEngineScript pour porter le script javascript
qscript = QtWebEngineWidgets.QWebEngineScript()
# fait que le script ne sera injecté qu'à la fin du chargement de la page
qscript.setInjectionPoint(QtWebEngineWidgets.QWebEngineScript.Deferred)
# code source du script javascript
scriptjs = """
window.location.hash = "{}"
""".format(ancre)
# charge le code source du script
qscript.setSourceCode(scriptjs)
# exécute le script à la fin du chargement de la page
self.view.page().profile().scripts().insert(qscript)
#############################################################################
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
aide = AideHtml()
aide.show()
fichieraide = os.path.abspath("aide.html")
ancre = "partiecommune" # permet d'afficher la page sur l'ancre "#partiecommune"
aide.affichepage(fichieraide, ancre)
sys.exit(app.exec_()) |
Partager