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
不知道你这个问题是否已经解决, 如果还没有解决的话:组件提升为QWebEngineView后,我们就可以用它来加载HTML文件,并在其中显示
QString htmlPath = "你的html文件的路径";
ui->widget->load(QUrl(htmlPath));