QWebEngineView在load()或page()方法崩溃

Ver*_*sen 4 qt qtwebengine qt5.6

我正在努力将Qt 5.5,QWebView项目移植到Qt 5.6(beta),QWebEngine.我在这里看过移植指南.我的代码看起来像这样:

.h文件定义_view如下:

QWebEngineView* _view;
Run Code Online (Sandbox Code Playgroud)

并且.cpp构造函数(类继承自QWidget)具有:

QVBoxLayout* vbox = new QVBoxLayout(this);
_view = new QWebEngineView(this);
    connect(_view, SIGNAL(loadFinished(bool)), this, SLOT(loadPageFinished(bool)));
QString webDir = getReportBasePath() + no_tr("/index.html#") + startingPage;
//  QWebEnginePage *page = _view->page();   // <-- CRASH!!
_view->load( QUrl("file:///" + webDir ) );  // <-- CRASH!!
_view->show();
vbox->addWidget(_view);
Run Code Online (Sandbox Code Playgroud)

在执行page()或load()方法时,整个事情崩溃了:

Unhandled exception at 0x67019C66 (Qt5Cored.dll) in qxs.exe: 0xC0000005: 
Access violation reading location 0x00000000.
Run Code Online (Sandbox Code Playgroud)

我已经验证了_view指针不是null.

如果您查看文档,他们在这里有一个示例,它几乎与我上面的代码完全相同.我也尝试将load()调用替换为与他们相同:

view->load(QUrl("http://qt-project.org/"));
Run Code Online (Sandbox Code Playgroud)

它仍然崩溃.什么可能导致这些崩溃的想法?

我是否需要首先创建QWebEnginePage并在QWebEngineView上创建setPage()?(我假设没有...)它是否与我正在使用的Qt二进制文件(预先为Windows 32位MSVC 2013构建)有关?

堆栈跟踪的相关部分:

    Qt5WebEngineWidgetsd.dll!QWebEnginePagePrivate::QWebEnginePagePrivate(QWebEngineProfile * _profile) Line 95 C++
    Qt5WebEngineWidgetsd.dll!QWebEnginePage::QWebEnginePage(QObject * parent) Line 393  C++
    Qt5WebEngineWidgetsd.dll!QWebEngineView::page() Line 145    C++
    Qt5WebEngineWidgetsd.dll!QWebEngineView::load(const QUrl & url) Line 157    C++
    qxs.exe!ReportWidget::ReportWidget(QcaMain * qm, QWidget * parent, QString startingPage) Line 321   C++
Run Code Online (Sandbox Code Playgroud)

它在这里崩溃:

QWebEnginePagePrivate::QWebEnginePagePrivate(QWebEngineProfile *_profile)
    : adapter(new WebContentsAdapter)
    , history(new QWebEngineHistory(new QWebEngineHistoryPrivate(this)))
    , profile(_profile ? _profile : QWebEngineProfile::defaultProfile())
    , settings(new QWebEngineSettings(profile->settings()))
    , view(0)
    , isLoading(false)
    , scriptCollection(new QWebEngineScriptCollectionPrivate(browserContextAdapter()->userScriptController(), adapter.data()))
    , m_backgroundColor(Qt::white)
    , fullscreenMode(false)
{
    memset(actions, 0, sizeof(actions));
}
Run Code Online (Sandbox Code Playgroud)

我想也许这与_profile为NULL有关,所以我试图先设置一个QWebEngineProfile,如下所示:

QWebEnginePage* page = new QWebEnginePage(  QWebEngineProfile::defaultProfile(), _view );
_view->setPage( page );
Run Code Online (Sandbox Code Playgroud)

然后它反而在qwebengineprofile.cpp崩溃:

static QWebEngineProfile* profile = new QWebEngineProfile(
            new QWebEngineProfilePrivate(BrowserContextAdapter::defaultContext()),
            BrowserContextAdapter::globalQObjectRoot());
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

    Qt5Cored.dll!convert_to_wchar_t_elided(wchar_t * d, unsigned int space, const char * s) Line 256    C++
    Qt5Cored.dll!qt_message_fatal(QtMsgType __formal, const QMessageLogContext & context, const QString & message) Line 1593    C++
    Qt5Cored.dll!QMessageLogger::fatal(const char * msg, ...) Line 784  C++
    Qt5WebEngineCored.dll!`anonymous namespace'::subProcessPath(void)   C++
    Qt5WebEngineCored.dll!WebEngineLibraryInfo::getPath(int)    C++
    Qt5WebEngineCored.dll!WebEngineContext::WebEngineContext(void)  C++
    Qt5WebEngineCored.dll!WebEngineContext::current(void)   C++
    Qt5WebEngineCored.dll!QtWebEngineCore::BrowserContextAdapter::defaultContext(void)  C++
>   Qt5WebEngineWidgetsd.dll!QWebEngineProfile::defaultProfile() Line 516   C++
Run Code Online (Sandbox Code Playgroud)

Ver*_*sen 8

问题解决了.我错过了QWebEngine所需的一些关键文件,否则它会崩溃.这些文件必须与可执行文件位于同一目录中.它们由windeployqt.exe工具放在那里,因此这是确保您的Qt应用程序具有运行所需的一切而不会崩溃的最佳方法.

qtwebengine_resources.pak
qtwebengine_resources_100p
qtwebengine_resources_200p.pak.pak
QtWebEngineProcess.exe
icudtl.dat  
Run Code Online (Sandbox Code Playgroud)

之所以这样,我们的开发小组以前使用的是Qt 4.8,并使用内部方法将所需的Qt dll和whatnot复制到目标目录中.升级到Qt 5.x并添加QWebEngine时,我们没有意识到上面的文件是必需的.