PDF in SubWindow einbinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
versuche gerade ein PDF in ein SubWindow einzubinden.
dazu verwende ich folgendes:

Code: Alles auswählen

if self.file_extension == 'pdf':
    webView = QWebEngineView()
    page = MyWebEnginePage(self)
    # connect to the signal
    page.dataLinkClicked.connect(self.handleDataLink)
    webView.setPage(page)
    # use a data-url
    webView.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
    webView.settings().setAttribute(QWebEngineSettings.PdfViewerEnabled, True)
    webView.setUrl(QUrl.fromLocalFile(self.pdf_path))
Ich bekomme zu PdfViewerEnabled die Fehlermeldung:
AttributeError: type object 'QWebEngineSettings' has no attribute 'PdfViewerEnabled'
Meine Python-Version ist 3.8 und PyQt5.

An was liegt es?
- falscher Code
- falsche Version bei Python und PyQt

Gibt es eine bessere Lösung?

Grüße Nobuddy
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

"PyQt5" reicht nicht als Versionangabe. Welche Version von PyQt5?
Woher hast du die Information, dass es dieses Attribut geben soll? Falls das nicht aus der offiziellen qt-Dokumentation ist, dann musst du dort auf die Suche gehen. Und dann findest du den Hinweis, dass es das erst ab Qt 5.13 gibt.
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

python-pyqt5 hat die Version 5.14.1
Den Code, habe ich dort https://stackoverflow.com/questions/740 ... -url-links gefunden.
In der offiziellen qt-Dokumentation, habe ich darüber nichts gefunden.

Mein Sytem ist Kubuntu 20.04. Werde in Kürze auf 22.04 upgraden, vielleicht gibt es dann diese Fehlermeldung nicht mehr.

Gibt es noch einen anderen Ansatz, um PDF's in SubWindows einzubinden?
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
habe am Wochenende auf Kubuntu 22.04 upgegradet, danach kam die Fehlermeldung nicht mehr und PDF's werden im SubWindow geladen.

Code: Alles auswählen

class PdfReport(object):

	def __init__(self, parent):
		QWES = QWebEngineSettings
		parent.viewer = QWebEngineView()
		parent.viewer.loadFinished.connect(parent.mdiTabCallback)
		settings = parent.viewer.settings()
		settings.setAttribute(QWES.PluginsEnabled, True)
		settings.setAttribute(QWES.PdfViewerEnabled, True)
		parent.viewer.setWindowTitle(parent.filename)
		self.load_pdf(parent)

	def load_pdf(self, parent):
		url = QUrl.fromLocalFile(parent.filepath).toString()
		parent.viewer.load(QUrl.fromUserInput(parent.filepath))
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nobuddy: Da ist eine extrem komische Klasse die a) gar keinen Zustand hat, und b) extrem viel mit `parent` anstellt. Das sollte wohl eher eine Methode auf `parent` sein.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Ich habe dies aus meinem MainWindow ausgelagert, ist für mich übersichtlicher.
Vielleicht kannst Du mir eine Alternative aufzeigen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das uebersichtlicher ist ja gut, aber warum nicht einfach nur eine Funktion? Das ist doch uebersichtlich, und vermeidet die vollkommen ueberfluessige Klasse.
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei es IMHO nicht so wirklich Sinn macht Methoden aus Klassen heraus zu ziehen, die tatsächlich Methoden sind. Das wird dadurch *unübersichtlicher* das plötzlich externe Funktionen anfangen an Interna von Objekten herum zu fummeln. `parent` sollte da beispielsweise nicht übergeben werden.

Edit: Als externe Funktion wäre das so etwas hier (ungetestet) und so wie hier `filepath` und `filename` verwendet werden, sieht das so aus als würde `filepath` den `filename` enthalten, das sollten also eigentlich weder hier zwei Argumente sein, noch auf dem ursprünglichen Objekt zwei Attribute (ausser `filename` ist dort ein `property()`):

Code: Alles auswählen

def create_pdf_viewer(filepath, filename, on_load_finished):
    viewer = QWebEngineView(
        windowTitle=filename, loadFinished=on_load_finished
    )
    settings = viewer.settings()
    settings.setAttribute(settings.PluginsEnabled, True)
    settings.setAttribute(settings.PdfViewerEnabled, True)
    viewer.load(QUrl.fromUserInput(filepath))
    return viewer
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Danke für den Code, funktioniert prima und ist einfacher :wink:
Antworten