In Qt-Version 6.9 habe ich den folgenden Code geschrieben, um das QWebEnginePage-Verhalten zu überschreiben:
Code: Select all
from PyQt6.QtWebEngineCore import QWebEnginePage
from urllib.parse import urlparse
import markdown2
class MyView(QWebEnginePage):
def acceptNavigationRequest(self, qurl, navtype, mainframe) -> bool:
parse_info = urlparse(qurl.url())
if parse_info.scheme.lower() == "file":
if parse_info.path.lower().endswith(".md"):
my_html = markdown2.markdown_path(parse_info.path)
self.setHtml(myhtml,
baseUrl=qurl)
return False
Heute wurde mein System auf Qt 6.10 aktualisiert. Derselbe Code führt jetzt zum Absturz der Anwendung (keine Meldung – Exit-Code 133). Ein Blick auf die Qt 6.10-Seite „Was hat sich geändert“ gibt keinen Aufschluss darüber, warum – zumindest für mich.
Ich kann beweisen, dass der setHTML-Aufruf die Ursache für den Absturz ist, indem ich ihn auskommentiere. In diesem Fall „funktioniert“ die Anwendung (gibt aber rohen Markdown aus, der nur einfacher Text ist).
Die Frage ist also: Wie kann eine URL richtig abgefangen und der zu seinde HTML-Inhalt ersetzt werden? angezeigt?
BEARBEITEN:
Danke an @ekhumoro für den Link und die Lösung.
Ich kann bestätigen, dass QTimer.singleShot(0, lambda: self.setHtml(myhtml, baseUrl=qurl)) den HTML-Code tatsächlich wie erforderlich lädt.
Allerdings: Während ich mich weiterentwickle, stelle ich fest, dass der setHTML-Ansatz beim Versuch, einzufügen, eine Reihe von Nachteilen hat Es handelt sich um die Verwendung in einem Browserfenster, das möglichst allgemein gehalten sein soll. Insbesondere wird der Seitenverlauf aus Benutzersicht unterbrochen. Auch die Größenbeschränkung (unter 2 MB für HTML-Daten) bringt Einschränkungen mit sich.
Ich arbeite an einem alternativen Ansatz mit JavaScript und Webkanälen – ich werde hier in einem Kommentar ein vollständig funktionierendes Beispiel veröffentlichen, wenn es funktioniert.
Mobile version