gpt4 book ai didi

c++ - QT QWebEnginePage::setWebChannel() 传输对象

转载 作者:行者123 更新时间:2023-12-03 02:58:35 29 4
gpt4 key购买 nike

我正在使用 QT WebEngine 框架来显示网页。我在页面加载时将 JavaScript 注入(inject)到页面中,并希望允许 JavaScript 能够访问 QT 对象。显然,要做到这一点,必须存在一个 QWebChannel,它在 chromium(javascript)和我的 C++/QT 项目的其余部分之间建立一些 IPC。我遇到了 QWebEnginePage::setWebChannel (QWebChannel *channel) 函数,但是我找不到任何使用它的示例。文档( http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel )提到 qt.webChannelTransport 应该在 javascript 上下文中可用,但我没有看到 qwebchannel.js ( https://github.com/qtproject/qtwebchannel/blob/dev/src/webchannel/qwebchannel.js )中建立的位置。我已经看过 WebChannel 示例 ( http://doc.qt.io/qt-5/qtwebchannel-examples.html ),并且希望尽可能避免使用 WebSocket。

以下是我尝试实现网络 channel 的方法。

每当页面加载时,我都会建立一个 channel 并在 C++ 中注入(inject) javascript:

QWebChannel *channel = new QWebChannel();
channel->registerObject(QStringLiteral("jshelper"), helper);

view->page()->runJavaScript(qwebjs); //this is qwebchannel.js
view->page()->setWebChannel(channel);
view->page()->runJavaScript(myfunction); //function that calls QT object (jshelper)

在 JavaScript 中:

new QWebChannel(qt.webChannelTransport, function(channel) { ... });

这会导致 channel 无法正确连接(假设这是因为 qt.webChannelTransport,因为它在我使用 WebSockets 时正在工作)。任何指向以这种方式使用 QWebEnginePage 设置 QWebChannel 示例的指针也将受到赞赏。

最佳答案

简短回答:添加<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>到您的 html 页面(当然在调用 new QWebChannel 之前),然后删除行 view->page()->runJavaScript(qwebjs); //this is qwebchannel.js来自您的 C++ 代码。

长答案:

我在弄清楚如何在没有 WebSocket 的情况下正确使用 QWebChannel 时也遇到了很多麻烦——在深入研究 Qt 5.5 源代码和邮件列表后设法让它工作(仍然缺乏文档)。请注意,这只适用于 the new Qt 5.5

以下是如何使用 QWebChannel:

// file: MyWebEngineView.cpp, MyWebEngineView extends QWebEngineView
QWebChannel *channel = new QWebChannel(page());

// set the web channel to be used by the page
// see http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel
page()->setWebChannel(channel);

// register QObjects to be exposed to JavaScript
channel->registerObject(QStringLiteral("jshelper"), helper);

// now you can call page()->runJavaScript(...) etc
// you DON'T need to call runJavaScript with qwebchannel.js, see the html file below

// load your page
load(url);

在 JS 方面:

<!-- NOTE: this is what you're missing -->
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>

<script type="text/javascript">
<!-- it's a good idea to initialize webchannel after DOM ready, if your code is going to manipulate the DOM -->
document.addEventListener("DOMContentLoaded", function () {
new QWebChannel(qt.webChannelTransport, function (channel) {
var jshelper = channel.objects.jshelper;
// do what you gotta do
});
});
</script>

另请确保您已添加 QT += webenginewidgets webchannel给您.pro文件,否则将无法构建!

奖励:您现在可以通过 Chrome 开发工具轻松调试 JavaScript!只需将其添加到 Qt 代码中的某个位置(最好是在应用程序启动中):

#ifdef QT_DEBUG
qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "23654");
#endif

然后启动您的应用程序,导航至 http://localhost:23654在 Chrome 中,您将获得功能齐全的 JS 调试器、分析器、控制台等:)

<小时/>

后续 (19/04/2016):如果您的远程调试器无法正常工作,请注意 qputenv调用还必须发生在对 QWebEngineSettings 的任何调用之前或任何其他与 WebEngine 相关的类,因为它们会立即触发 WebEngine“zygote”进程(zygote 是父 QtWebEngineProcess,所有 future 的 QtWebEngineProcess 均从中 fork ),然后 qputenv不能影响它。花了几个小时来追踪这一点。

关于c++ - QT QWebEnginePage::setWebChannel() 传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928444/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com