2016-11-20 3 views
0

Ich habe festgestellt, dass QWebEngineView sehr seltsam verhält (Windows PyQt5 mit Qt 5.7.0) und in einigen Fällen nicht ordnungsgemäß beendet die Anwendung hängen. Das folgende Snippet funktioniert einwandfrei. Aber wenn Sie beide Zeilen, die mit #1 und #2 markiert sind, auskommentieren und dann versuchen, die Anwendung zu schließen, wird die Anwendung blockiert. Das Gleiche passiert, wenn Sie nur #3 auskommentieren. Ich versuchte dies mit anderen Widgets als QWebEngineView, und keine Probleme aufgetreten.QWebEngineView schließt in einigen Fällen nicht richtig

import sys 
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 
app = QtWidgets.QApplication(sys.argv) 
mainWindow = QtWidgets.QMainWindow() 
widget = QtWebEngineWidgets.QWebEngineView() 
# widget.load(QtCore.QUrl("http:/www.google.com")) #1 
mainWindow.setCentralWidget(widget) 
# mainWindow.setCentralWidget(None)     #2 
# widget.deleteLater()        #3 
mainWindow.show() 
result = app.exec_() 
sys.exit(result) 

Dies ist der kürzeste Code, der den Fehler reproduzieren kann. Aber was ich in meiner viel größeren Anwendung brauche, ist, die Web-Engine-Ansicht als zentrales Widget festzulegen und sie dann mit Menüaktionen zu schließen und ein anderes Widget als zentrales Widget festzulegen. Irgendwelche Ideen, wie man das Verhalten reparieren und das erwartete Verhalten erreichen kann? Oder mache ich etwas falsch?

UPDATE:

Ich fand noch einfacheres Beispiel das beschriebene Problem zeigt. Bei Ausführung unter Windows lässt PyQt 5.7 die Anwendung hängen.

import sys 
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 
app = QtWidgets.QApplication(sys.argv) 
widget = QtWebEngineWidgets.QWebEngineView() 
widget.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
widget.show() 
sys.exit(app.exec_()) 

UPDATE2: Ich erstelle ein Ticket für diese, da dies als einen Fehler zu mir scheint. https://bugreports.qt.io/browse/QTBUG-57228 Bevor jedoch der Fix bereitgestellt wird, wird eine Problemumgehung sehr geschätzt.

+0

FWIW, ich kann das auf Linux nicht reproduzieren. In Ihrer tatsächlichen Anwendung, ich nehme an, Sie könnten nur die Web-Ansicht ausblenden(), anstatt sie zu löschen. – ekhumoro

+0

Haben Sie das in PyQt5 versucht? Oder ähnlicher Code in Qt5 (C++)? Meine wilde Vermutung ist, dass einige Python-Referenzen nicht korrekt behandelt werden, wenn das Widget gelöscht wird, was dazu führt, dass GC das Widget nicht entsorgt. Daher denke ich, das wird in C++ kein Problem sein. –

+0

Leider ist das Verstecken des Widgets in meinem Fall keine Lösung. :(Hinweis: Ich versuche auch das ältere WebKit (Vorgänger der WebEngine) und es funktioniert gut. –

Antwort

1

Scheint, dass ich del widget und del app nur zwischen result = app.exec_() und sys.exit(result) hinzufügen muss. Dann funktioniert es wie erwartet. Wahrscheinlich kein Problem in QtWebEngine, aber in PyQt5 nicht alle Referenzen ordnungsgemäß freigegeben.

Siehe Kommentare zu https://bugreports.qt.io/browse/QTBUG-57228

Verwandte Themen