You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭带网页内容的QDialog后QWebEngineProcess.exe进程未退出问题

QWebEngineProcess进程残留问题解决

根因

Qt WebEngine默认使用全局生命周期的QWebEngineProfile实例管理渲染进程资源,即使所有QWebEngineView控件被销毁,全局Profile依然持有渲染进程引用,导致进程不会自动退出。

修复方案

为每个弹窗内的WebView使用独立的Profile和Page实例,弹窗销毁时主动释放所有关联资源,即可触发渲染进程自动退出。
修改后的完整可运行代码如下:

#include <QApplication>
#include <QWebEngineView>
#include <QWebEngineSettings>
#include <QWebEnginePage>
#include <QWebEngineProfile>
#include <QDialog>
#include <QMainWindow>
#include <QLayout>
#include <QPushButton>

class Dialog : public QDialog
{
public:
    Dialog() : QDialog(nullptr)
    {
        resize(512, 512);
        setAttribute(Qt::WA_DeleteOnClose);
        auto verticalLayout = new QVBoxLayout(this);
        verticalLayout->setSpacing(0);
        verticalLayout->setContentsMargins(0, 0, 0, 0);

        // 创建独立Profile,不使用全局默认实例
        m_profile = new QWebEngineProfile(this);
        // 不需要持久化缓存可开启off-the-record模式,释放速度更快
        // m_profile->setOffTheRecord(true);
        m_page = new QWebEnginePage(m_profile, this);
        m_webView = new QWebEngineView(this);
        m_webView->setPage(m_page);
        verticalLayout->addWidget(m_webView);
    }

    void openPage(const QUrl& url)
    {
        m_webView->setUrl(url);
    }

    ~Dialog() override
    {
        // 主动按顺序释放资源
        if (m_webView) {
            m_webView->setPage(nullptr);
            m_webView->deleteLater();
        }
        if (m_page) {
            m_page->deleteLater();
        }
        if (m_profile) {
            m_profile->deleteLater();
        }
    }

private:
    QWebEngineView* m_webView = nullptr;
    QWebEnginePage* m_page = nullptr;
    QWebEngineProfile* m_profile = nullptr;
};


class MainWindow : public QMainWindow
{
public:
    MainWindow() : QMainWindow(nullptr)
    {
        resize(512, 512);
        QPushButton* btn = new QPushButton("open web dialog", this);
        connect(btn, &QPushButton::clicked, [this] ()
                {
                    if (m_dialog.isNull())
                    {
                        m_dialog = new Dialog();
                        m_dialog->openPage(QUrl("https://www.qt.io"));
                        m_dialog->show();
                    }
                });
    }

private:
    QPointer<Dialog> m_dialog;

};

int main(int argc, char *argv[])
{
    QCoreApplication::setOrganizationName("QtExamples");
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QApplication app(argc, argv);

    MainWindow window;
    window.show();

    return app.exec();
}

注意事项

  • 该方案兼容Qt 5.15+、Qt 6.x所有正式版本
  • 若全局仅存在一个Web使用场景,也可以在销毁WebView后调用QWebEngineProfile::defaultProfile()->deleteLater(),但会导致后续再创建Web组件时需要重新初始化Profile,适合单场景使用的项目

内容的提问来源于stack exchange,提问作者Holiday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:36:01