头发继续乱 2023-04-04 20:55 采纳率: 47.4%
浏览 70
已结题

QWebEngineView 如何释放资源

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


#include "HtmlDialog.h"
#include <QDebug>
#include <QBoxLayout>
#include <QWidget>


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()
{

}

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-04-04 21:30
    关注
    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 不会被释放,而是被添加到主窗口的布局中,避免了程序崩溃风险。
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月14日
  • 创建了问题 4月4日

悬赏问题

  • ¥15 vue请求不到数据,返回状态200,数据为html
  • ¥15 访问url时不会自动调用其 Servlet的doGet()
  • ¥15 用白鹭引擎开发棋牌游戏的前端为什么这么难找
  • ¥15 MATLAB解决问题
  • ¥35 哪位专业人士知道这是什么原件吗?哪里可以买到?
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享