- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我继承自QWebEngineUrlSchemeHandler。重新定义方法 requestStarted(QWebEngineUrlRequestJob *request)
在我尝试调用 QWebEngineUrlRequestJob::reply 之后
例如
void CustomUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *request)
{
qDebug() << "CustomUrlSchemeHandler::requestStarted -->>> " << request->requestUrl();
QMimeDatabase HelpViewer;
QMimeType mt = HelpViewer.mimeTypeForUrl(request->requestUrl());
const QString mimeType = mt.name();
QByteArray arr = QString::fromStdString("<html><body>Hello world</body></html>").toUtf8();
QBuffer *buffer = new QBuffer(&arr, this);
buffer->open(QIODevice::ReadOnly);
request->reply(mimeType.toLatin1(), buffer);
return;
}
但是程序崩溃了。查看日志:
[1126/113403:FATAL:weak_ptr.cc(26)] Check failed: sequence_checker_.CalledOnValidSequencedThread(). WeakPtrs must be checked on the same sequenced thread.
Backtrace:
base::debug::StackTrace::StackTrace [0x11A78691+33] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\debug\stack_trace_win.cc:205)
logging::LogMessage::~LogMessage [0x119CB2AF+63] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\logging.cc:544)
base::internal::WeakReference::Flag::IsValid [0x119FB75A+234] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\memory\weak_ptr.cc:28)
base::internal::WeakReference::is_valid [0x119FB7B2+50] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\memory\weak_ptr.cc:43)
base::WeakPtr<base::ObserverListBase<content::ServiceWorkerContextObserver> >::get [0x109EF57F+31] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\memory\weak_ptr.h:204)
base::internal::InvokeHelper<1,void,base::internal::RunnableAdapter<void (__thiscall content::DownloadResourceHandler::*)(void)>,base::internal::TypeList<base::WeakPtr<content::DownloadResourceHandler> const &> >::MakeItSo [0x107B8ADB+11] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\bind_internal.h:300)
base::internal::Invoker<base::IndexSequence<0>,base::internal::BindState<base::internal::RunnableAdapter<void (__thiscall content::DownloadResourceHandler::*)(void)>,void __cdecl(content::DownloadResourceHandler *),base::internal::TypeList<base::WeakPtr<c [0x107BAD0A+58] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\bind_internal.h:346)
base::Callback<net::URLRequestContext * __cdecl(void)>::Run [0x1096CACF+47] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\callback.h:396)
base::debug::TaskAnnotator::RunTask [0x11A9580D+541] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\debug\task_annotator.cc:64)
base::MessageLoop::RunTask [0x119DAAF8+456] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_loop.cc:475)
base::MessageLoop::DeferOrRunPendingTask [0x119D9204+52] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_loop.cc:485)
base::MessageLoop::DoWork [0x119D974D+221] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_loop.cc:594)
base::MessagePumpForIO::DoRunLoop [0x11A980A2+50] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_pump_win.cc:524)
base::MessagePumpWin::RunWithDispatcher [0x11A99B42+130] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_pump_win.cc:51)
base::MessagePumpWin::Run [0x11A99AAC+28] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_pump_win.cc:58)
base::MessageLoop::RunHandler [0x119DA907+247] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_loop.cc:438)
base::RunLoop::Run [0x11A0A2E6+70] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\run_loop.cc:56)
base::MessageLoop::Run [0x119DA7BD+237] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\message_loop\message_loop.cc:288)
base::Thread::Run [0x11A20AF6+22] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\threading\thread.cc:199)
content::BrowserThreadImpl::IOThreadRun [0x10603B74+52] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\content\browser\browser_thread_impl.cc:212)
content::BrowserThreadImpl::Run [0x1060498B+235] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\content\browser\browser_thread_impl.cc:246)
base::Thread::ThreadMain [0x11A215F9+745] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\threading\thread.cc:248)
base::`anonymous namespace'::ThreadFunc [0x11A283B6+262] (e:\lib\qt\qt_git\qt5\qtwebengine\src\3rdparty\chromium\base\threading\platform_thread_win.cc:84)
BaseThreadInitThunk [0x75D57C04+36]
RtlInitializeExceptionChain [0x77E4AD1F+143]
RtlInitializeExceptionChain [0x77E4ACEA+90]
(No symbol) [0x00000000]
最佳答案
崩溃的原因并不明显,因为Qt documentation不清楚 QWebEngineUrlSchemeHandler
应该如何实现的细节。
你的程序崩溃是因为 QWebEngineUrlRequestJob::reply()
稍后使用了 buffer 参数,超出调用者的范围,可能来自不同的线程。您在堆栈上声明的局部变量 QByteArray
arr 届时将超出范围,QWebEngine 将访问无效指针.
另一件事是,reply()
不会取得传递的 buffer 对象的所有权,也不会删除它。这引入了内存泄漏。出于与上述相同的原因,您不能在调用 reply()
后立即删除它。为确保 buffer 对象在不再需要时被删除,将 request 的 destroyed()
信号连接到 buffer 的 deleteLater()
插槽。
这是一个完整的无泄漏示例:
void CustomUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *request)
{
QBuffer *buffer = new QBuffer;
connect(request, SIGNAL(destroyed()), buffer, SLOT(deleteLater()));
buffer->open(QIODevice::WriteOnly);
buffer->write("<html><body>Hello world!</body></html>");
buffer->close();
request->reply("text/html", buffer);
}
注意:您根本不需要使用QByteArray
。 QBuffer
的默认构造函数分配自己的存储空间。
关于c++ - Qt 5.6 alpha QtWebEngine。如何使用 QWebEngineUrlRequestJob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33933958/
来自here ,我知道我可以使用 QWebEngineView::render,传递指向 QPrinter 对象的指针,以编程方式打印网页。 但是,如果打印请求是由 javascript 调用的(例如
我有一个使用 OAuth 2.0 授权的应用程序(http://vk.com 的音频播放器)。我所做的是我实现了 QtWebEngineView 对象并用它来打开授权页面。基本上,看起来目前我正在为这
您好,我正在尝试将 QWebEngine URL 设置为位于工作目录中的 index.html 文件。我试图通过将 URL 设置为 ./index.html 来使用该文件,但它似乎无法找到该文件。 我
我有一个使用 OAuth 2.0 授权的应用程序(http://vk.com 的音频播放器)。我所做的是实现 QtWebEngineView 对象并使用它打开授权页面。基本上,看起来目前我正在为这么小
我有一个简单的 C++(非 Qt Quick)应用程序(不使用 .pro 机制)针对官方 Qt 5.4.2 x64 构建(具有 openGL 支持)构建。一旦我在我的应用程序中使用 QWebEngin
最近 Qt 引入了 QtWebEngine 模块。有没有办法在 QWebEngineView 中调用开发者工具和调试 JavaScript 代码? QWebView 可以使用 page()->sett
我正在使用带有模块 QtWebEngine 的新 Qt5.4,据我所知,mainFrame() 不再存在。如何获取页面的contentSize/size,现在如何渲染?我尝试使用 setView 和
我扩展了QWebEngineView。 #ifndef MYQWEBENGINEVIEW_H #define MYQWEBENGINEVIEW_H #include class MyQWebEngi
我们目前正在将一个项目从 QtWebkit 迁移到 QWebEngine。但是,处理下载会让人有些头疼。以前我们使用 QWebPage::unsupportedContent 信号来处理这个问题,如下
我正在尝试使用自定义 URL 方案重写多个 HTTP 请求: 所有请求 http://static.foo.bar应该改写为static://...并提供一些回复。 问题: 拦截和重定向似乎有效,但无
QtWebEngine 时如何允许使用 WebRTC 网络摄像头请求(是否使用 QML 插件时)? webengine.qml import QtQuick 2.1 import QtQuick.Co
这个问题在这里已经有了答案: QWebView or QWebEngineView (3 个回答) 5年前关闭。 我认为标题几乎解释了一切。 但是,您将如何解释这两个术语在 Qt 中显示网页内容的作用
我正在尝试让 QtWebEngine 在 VM 上运行并且遇到了困难。根据 this question 的回答: Eventually I realised that OpenGL 3.3 would
我正在尝试从源代码构建 QtWebengine,所以我所做的是从 http://code.qt.io/cgit/qt/qtwebengine.git/ 下载 qtwebengine 我还安装了 htt
我想在 QML 中与 PyQT 一起使用 QtWebEngine。我正在尝试运行简单的示例。 import sys from PyQt5.QtCore import QUrl from PyQt5.Q
我正在将应用程序从 QtWebKit 升级到 QtWebEngine。该应用程序依赖于 WebKit 在关闭应用程序后不会保留 cookie,但 WebEngine 似乎默认保留它们。 我对 Qt 一
我是第一次尝试 Qt,想创建一个非常基本的应用程序来加载网站。我想使用 Qt WebEngine。 这是我的 helloworld.pro: TEMPLATE = app TARGET = hello
我的一个 C++ 类中有以下方法(使用 QtWebEngine): QString get() { QString result; view->page
当 QML 程序(例如以太坊,在本例中为 installed from the PPA)尝试 import QtWebEngine 1.0 import QtWebEngine.experimenta
我们需要在 QtwebengineView 中支持 mp4 文件。因此,我们正在尝试在 msvc2015 x64 上使用专有编解码器构建 Qt 5.9.1 的 qtwebengine,方法是在 cmd
我是一名优秀的程序员,十分优秀!