繁体   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