Я работаю над переносом проекта 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++
Покажите нам трассировку для этой аварии Пожалуйста. –
Хорошо, у меня есть трассировка стека. Я обновлю свое оригинальное сообщение, чтобы включить новую информацию. –
Любая идея о том, как решить эту проблему на osx? –