QT QWebEnginePage :: setWebChannel()传输对象

时间:2015-08-10 20:22:30

标签: c++ qt qtwebengine qt5.5

我正在使用QT WebEngine框架来显示网页。我在加载时将javascript注入页面,并希望允许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),并希望尽可能避免使用WebSockets。

以下是我尝试实施网络渠道的方法。

每当页面加载时我建立一个频道并用C ++注入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) { ... });

这导致频道未正确连接(假设这是因为qt.webChannelTransport,因为它在我使用WebSockets时工作)。任何使用QWebEnginePage以这种方式设置的QWebChannel示例的指针也很受欢迎。

1 个答案:

答案 0 :(得分:25)

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

答案很长:

我在确定如何正确使用没有WebSockets的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 Dev Tools中轻松调试JavaScript!只需在Qt代码中添加它(理想情况是在应用程序启动时):

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

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

后续行动(2016年4月19日):如果您的远程调试器无法正常工作,请注意之前必须发生qputenv来电任何对QWebEngineSettings或任何其他WebEngine相关类的调用,因为它们会立即触发WebEngine“zygote”进程(受精子是所有未来QtWebEngineProces所分叉的父QtWebEngineProcess),然后qputenv不会影响它。花了几个小时跟踪这个。