关于c ++:关闭应用程序后,Qtwebengineprocess没有关闭

Qtwebengineprocess is not closed after application closing

我有一个使用QtWebEngine的应用程序。但我发现,在关闭应用程序或崩溃后,"qtwebengineprocess"仍处于启用状态。我的应用程序太大,无法在这里显示,但这里有一个小例子,它也说明了问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <QApplication>
#include <QWebEngineView>
#include <QProcess>
#include <QTimer>


int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QWebEngineView* viewer = new QWebEngineView(NULL);
    viewer->show();
    viewer->load(QUrl("https://www.telegraph.co.uk/content/dam/Pets/spark/royal-canin/tabby-kitten-small.jpg?imwidth=1400"));
    QTimer::singleShot(2000, []() {
        exit(-1);
    });
    app.exec();
    delete viewer;

    return 0;
}

我忘了做点什么了吗?或者这是qt错误?事先谢谢。

更新:qt 5.11,win10


这似乎是Pyqt 5.11及更高版本中的错误。在重新安装操作系统和安装最新版本的Pyqt(5.11.3)之后,我遇到了QWebEngineView在布局中未正确调整大小的问题。降级到Pyqt 5.10.1,一切又正常运行。如果使用python,只需运行:

1
2
pip uninstall PyQt5
pip install PyQt5==5.10.1


我在这里找到了实际的问题和解决方案。这就是Qt5.11错误,它准确地描述了这个问题。

其中一条评论的解决方案对我很有用:

1
2
3
When running with QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
at the top of the main() function, I'm observing that the qtwebengine process closes correctly,
both when stopping the debugger and when the release exe crashes.

只是在创建我的qApp之前添加了这一行,没有看到任何崩溃。当然,这也带来了在qt上使用角度和动态gpu的优点和缺点,这里更详细。


参考本文,当main()中调用exit()时,本地作用域对象将不调用析构函数!exit()不返回。

任何放在app.exec()之后的代码(在您的情况下是delete viewer;之后的代码),只有在主eventlop退出/退出并返回给调用者之后才会执行,您的计时器从主循环内调用(stdlib)exit(),这意味着:您退出执行而不返回调用者,并且在app.exec()之后放置的任何代码都不会执行,i如果希望代码正确运行并执行delete viewer;,那么计时器应该退出主事件循环,因此需要调用app.quit()app.exit(-1)