首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QWebEngine:删除QWebEngineUrlRequestInterceptor会导致崩溃

QWebEngine:删除QWebEngineUrlRequestInterceptor会导致崩溃
EN

Stack Overflow用户
提问于 2020-01-07 15:19:23
回答 1查看 381关注 0票数 0

在我的项目中,我希望在打开/关闭应用程序时创建/删除QWebEnginePages。有了Qt5.9.7,一切都很好。切换到Qt5.12.6时,我的应用程序将崩溃。

我创建了一个小代码示例,在这个示例中,我只需单击一个按钮来创建和删除。当然,在我真正的项目中,我要确保所有的东西都是安全的,等等:

代码语言:javascript
复制
BrowserWidget::BrowserWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::Widget) {
  m_webView = new QWebEngineView(this);

  ui->setupUi(this);
  ui->verticalLayout->addWidget(m_webView);

  connect(ui->createBtn, &QPushButton::clicked, this,
          &BrowserWidget::createSession);
  connect(ui->deleteBtn, &QPushButton::clicked, this,
          &BrowserWidget::deleteSession);
}

BrowserWidget::~BrowserWidget() {
  delete ui;
}

void BrowserWidget::createSession() {
  m_page = new QWebEnginePage(this);
  m_interceptor = new UrlRequestInterceptor(this);
  m_page->profile()->setRequestInterceptor(m_interceptor);

  for (auto c : m_connections) {
    disconnect(c);
  }
  m_connections.clear();

  m_page->setUrl(
      QUrl(QStringLiteral("https://www.youtube.com/watch?v=rNSnfXl1ZjU")));
  m_webView->setPage(m_page);

  return;
}

void BrowserWidget::deleteSession() {
  delete m_page;
  delete m_interceptor; // This causes the crash
}

整个UrlRequestInterceptor.cpp看起来如下所示:

代码语言:javascript
复制
UrlRequestInterceptor::UrlRequestInterceptor(QObject *parent)
    : QWebEngineUrlRequestInterceptor(parent) {}

void UrlRequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo &info) {
  info.block(false);
  return;
}

当我快速打开并关闭"WebPages“时,delete m_interceptor将导致崩溃。当网页完全加载时,有时也会发生这种情况,但并不经常发生。我在文件里找不到任何关于它的东西。

你们中有谁知道在我删除m_interceptor之前,我怎样才能可靠地等待所有与拦截器/浏览器相关的事情的完成?

下面是堆栈跟踪(如果有用的话):

代码语言:javascript
复制
1   QtWebEngineCore::CustomProtocolHandler::MaybeCreateJob          Qt5WebEngineCored  0x7ffd06bdd708 
2   QtWebEngineCore::CookieMonsterDelegateQt::hasCookieMonster      Qt5WebEngineCored  0x7ffd0a4aa0ae 
3   QtWebEngineCore::CookieMonsterDelegateQt::hasCookieMonster      Qt5WebEngineCored  0x7ffd0a4b1ca5 
4   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b5a12 
5   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b4a01 
6   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b0769 
7   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b5777 
8   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a83c8 
9   QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a078f 
10  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a34ca 
11  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd0949ffdf 
12  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a65c5 
13  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094a67af 
14  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094c15d3 
15  QWebEngineCookieStorePrivate::q_func                            Qt5WebEngineCored  0x7ffd0b93f07d 
16  QtWebEngineCore::WebContentsAdapter::webContents                Qt5WebEngineCored  0x7ffd094b91bb 
17  QtWebEngineCore::JavaScriptDialogController::qt_static_metacall Qt5WebEngineCored  0x7ffd06db6c45 
18  QWebEngineQuotaRequest::QWebEngineQuotaRequest                  Qt5WebEngineCored  0x7ffd08ea7a85 
19  QtWebEngineCore::FilePickerController::mode                     Qt5WebEngineCored  0x7ffd0a1c5e75 
20  QtWebEngineCore::FilePickerController::mode                     Qt5WebEngineCored  0x7ffd0a1c4a31    

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-07 16:04:51

我认为您并不需要每次会话启动时都创建一个新的拦截器实例。只有一个实例,在您的BrowserWidget类中:

代码语言:javascript
复制
private:
    Ui::BrowserWidget *ui;
    UrlRequestInterceptor m_interceptor;

在小部件构造函数中初始化它:

代码语言:javascript
复制
BrowserWidget::BrowserWidget(QWidget *parent)
    : QWidget(parent), ui(new Ui::BrowserWidget), m_interceptor(this)

传递指向该页配置文件的指针:

代码语言:javascript
复制
void BrowserWidget::createSession() {
  m_page = new QWebEnginePage(this);
  m_page->profile()->setRequestInterceptor(&m_interceptor);

摆脱delete中的deleteSession

代码语言:javascript
复制
void BrowserWidget::deleteSession() {

  delete m_page;
//  delete m_interceptor; // This (no more) causes the crash
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59631239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档