QWebEngineView 如何释放资源

QWebEngineView 无论怎么释放,都会导致程序崩溃,除非,不使用QWebEngineView


#include "HtmlDialog.h"
#include 
#include 
#include 


HtmlDialog::HtmlDialog(QString path,QWidget* parent)
{

    //m_parentWidget = parent;
    qDebug() << "HHH2222222666";
    setWindowTitle("交易要素信息");
    setWindowFlags(Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint);

    // 设置窗口大小和位置
    int width = 64 * 12;
    int height = 42 * 12;
    QRect desktopRect = QGuiApplication::screens().at(0)->availableGeometry();// 使用 QGuiApplication 获取屏幕几何形状
    setGeometry(desktopRect.width() - width, desktopRect.height() - height, width, height);

    // 加载本地 HTML 文件
    QString h5path = path;
    QUrl url = QUrl::fromLocalFile(h5path);
    
    m_view = new QWebEngineView();
    
    m_view->load(url);
    qDebug() << "lodadwanle ";
    //// 将 QWebEngineView 添加到布局中
    m_layout = new QVBoxLayout(this);
    m_layout->addWidget(m_view);
    setLayout(m_layout);
    // 设置窗口固定大小
    setFixedSize(width, height);
    setWindowFlag(Qt::MSWindowsFixedSizeDialogHint);
    qDebug() << "su2";
    // 显示窗口
    //show();

}

HtmlDialog::~HtmlDialog()
{

    // 删除 m_view
    m_view->deleteLater();

    qDebug() << "~HtmlDialog start";
    m_layout->removeWidget(m_view);
    m_view->disconnect();

    // 隐藏并禁用 m_view
    m_view->hide();
    m_view->setDisabled(true);
    m_view->stop();
    qDebug() << "~close end3";
    m_view->close();
    qDebug() << "~close end2";
    m_view->deleteLater();
    qDebug() << "~deleteLater end";
    qDebug() << "~HtmlDialog end";
    
}

void HtmlDialog::closeView()
{

}

1. 在 HtmlDialog 类中添加一个成员变量 m_mainWindow,用于保存主窗口的指针。

2. 将 HtmlDialog 类的析构函数中的释放资源的代码修改为如下代码:

HtmlDialog::~HtmlDialog()
{
    // 隐藏并禁用 m_view
    m_view->hide();
    m_view->setDisabled(true);
    m_view->stop();

    // 将 m_view 从布局中移除
    m_layout->removeWidget(m_view);

    // 将 m_view 添加到主窗口的布局中
    m_mainWindow->layout()->addWidget(m_view);

    // 将 m_view 的父对象设置为主窗口
    m_view->setParent(m_mainWindow);

    // 将 m_view 置为 nullptr,避免野指针
    m_view = nullptr;

    qDebug() << "~HtmlDialog end";
}

3. 在主窗口中创建 HtmlDialog 对象时,将主窗口的指针传递给该对象:

HtmlDialog* dialog = new HtmlDialog(路径, this);

4. 在主窗口的析构函数中释放 HtmlDialog 对象的资源:

MainWindow::~MainWindow()
{
    // 删除 m_dialog
    delete m_dialog;
}

这样修改后,关闭 HtmlDialog 窗口时,m_view 不会被释放,而是被添加到主窗口的布局中,避免了程序崩溃风险。

你可以考虑使用CEF替代QWebEngineView

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/747761
  • 这篇博客你也可以参考下:QWebEngineView使用说明
  • 除此之外, 这篇博客: QT QWebEngineView加载百度地图中的 三、使用QWebEngineView加载HTML文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    组件提升为QWebEngineView后,我们就可以用它来加载HTML文件,并在其中显示

        QString htmlPath = "你的html文件的路径";
        ui->widget->load(QUrl(htmlPath));

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^