簡體   English   中英

創建 QApplication 后如何導入 QtWebEngineWidgets

[英]How to import QtWebEngineWidgets after QApplication has been created

我正在嘗試解決此錯誤:

QtWebEngineWidgets 必須在創建 QCoreApplication 實例之前導入。

這是不言自明的,但我正在嘗試制作一個可在 iPython 中使用的 GUI,它可以在創建 QApplication 實例后導入。

我怎樣才能解決這個錯誤並創建一個 PyQt5 GUI,它可以顯示 HTML 頁面,並且即使在用戶使用了 QApplication 實例(例如通過 matplotlib)之后也可以導入?

我試過這個,但仍然得到同樣的錯誤:

from PyQt5 import QtWidgets
import seaborn as sns
sns.boxplot([1],[1])
QtWidgets.QApplication.instance().quit()
from PyQt5 import QtWidgets, QtWebEngineWidgets

有一個 hack 可以解決這個問題,但它可能並不完全健壯。

想法是刪除對QApplication (如果存在)的所有 C++ 引用,以便可以安全地導入 web-engine 模塊。 這可以使用sip來完成,但有一些警告:如果第三方模塊保存了對舊QApplicationpython引用,然后嘗試使用它,它將引發如下錯誤:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: wrapped C/C++ object of type QApplication has been deleted

在實踐中,很難預測這種情況發生的可能性有多大,因為您無法就其他 Python 庫的編寫方式進行立法。 下面腳本中的webengine_hack函數試圖盡可能減少上述問題的可能性:

def webengine_hack():
    from PyQt5 import QtWidgets
    app = QtWidgets.QApplication.instance()
    if app is not None:
        import sip
        app.quit()
        sip.delete(app)
    import sys
    from PyQt5 import QtCore, QtWebEngineWidgets
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
    app = QtWidgets.qApp = QtWidgets.QApplication(sys.argv)
    return app

try:
    # just for testing
    from PyQt5 import QtWidgets
    app = QtWidgets.QApplication([''])
    from PyQt5 import QtWebEngineWidgets
except ImportError as exception:
    print('\nRetrying webengine import...')
    app = webengine_hack()
    from PyQt5 import QtWebEngineWidgets

view = QtWebEngineWidgets.QWebEngineView()
view.setHtml('<h1>Hello World</h1>')
view.show()

app.exec()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM