2016-02-12 3 views
4

Я работаю над переносом проекта Qt 5.5, QWebView в Qt 5.6 (beta), QWebEngine. Я прошел через проводник по портированию here. Мой код выглядит следующим образом:Ошибка QWebEngineView при использовании метода load() или страницы()

.h файл определяет _view следующим образом:

QWebEngineView* _view; 

и конструктор .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); 

После выполнения либо страницы() или нагрузки() метод, все это происходит сбой с:

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

Я подтвердил, что указатель _view не является нулевым.

Если вы посмотрите на документацию, у них есть пример here, который почти идентичен моему коду выше. Я также попытался заменить вызов load() идентичным своему:

view->load(QUrl("http://qt-project.org/")); 

и он по-прежнему падает. Любые идеи, что может вызвать эти сбои?

Нужно ли сначала создать QWebEnginePage и setPage() в QWebEngineView? (Я предполагаю, что не ...) Может ли это иметь какое-то отношение к двоичным файлам Qt (предварительно построенным для 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++ 

Он врезается здесь:

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)); 
} 

Я подумал, что что-то делать с _profile будучи NULL, поэтому я попытался первым установить QWebEngineProfile как так:

QWebEnginePage* page = new QWebEnginePage( QWebEngineProfile::defaultProfile(), _view); 
_view->setPage(page); 

Тогда вместо врезается в qwebengineprofile.cpp здесь:

static QWebEngineProfile* profile = new QWebEngineProfile(
      new QWebEngineProfilePrivate(BrowserContextAdapter::defaultContext()), 
      BrowserContextAdapter::globalQObjectRoot()); 

с трассировки стека:

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++ 
+0

Покажите нам трассировку для этой аварии Пожалуйста. –

+0

Хорошо, у меня есть трассировка стека. Я обновлю свое оригинальное сообщение, чтобы включить новую информацию. –

+0

Любая идея о том, как решить эту проблему на osx? –

ответ

5

Проблема решена. Мне не хватало некоторых ключевых файлов, требуемых QWebEngine, иначе это сработает. Эти файлы должны находиться в том же каталоге, что и исполняемый файл. Они помещаются туда инструментом windeployqt.exe, так что это лучший способ убедиться, что ваше приложение Qt имеет все необходимое для запуска без сбоев.

qtwebengine_resources.pak 
qtwebengine_resources_100p 
qtwebengine_resources_200p.pak.pak 
QtWebEngineProcess.exe 
icudtl.dat 

Причина этого у меня была наша группа разработчиков была ранее с использованием Qt 4.8 и использует метод в доме, чтобы скопировать необходимые библиотеки DLL Qt и этажерки в целевой каталог. При обновлении до Qt 5.x и добавлении QWebEngine мы не понимали, что файлы, указанные выше, были необходимы.

1

Вы можете установить переменные окружения для Windows под названием QTWEBENGINEPROCESS_PATH

Пример:

QTWEBENGINEPROCESS_PATH C:\Qt\Qt5.6.0\5.6\msvc2013_64\bin\QtWebEngineProcess.exe 

С помощью этого решения, не нужно копировать файлы ресурсы в свои проекты выходных папка

Смежные вопросы