如何使用Qt WebEngine和QWebChannel?

问题描述 投票:15回答:2

我正在使用新的WebEngine来玩和学习。我一直在尝试使用Qt WebKit找到一些类似的方法:addToJavaScriptWindowObject()

我发现使用Qt WebEngine,我必须使用QWebChannel将函数注册到Javascript窗口对象。如果这是正确的,它将带我到以下问题。

我在我的电脑上安装了Qt 5.4.0。我注意到在我的计算机上安装的SDK中找不到qwebchannel.js。我在Git源代码中找到了它。

如果我有一个带有QWebEnginePageQWebEngineView的Qt原生桌面应用程序,我需要能够在Javascript窗口对象上注册函数吗?

我的桌面应用程序自动导航到我创建的http页面。所以我可以访问连接到QWebEngineView的内容。

采取了哪些措施让我可以做到这一点?

javascript c++ qt
2个回答
14
投票

在Qt5.6中,如果你想让C ++部分和JavaScript进行通信,唯一的方法就是在QWebChannel上使用QWebEngineView,如你所说。你在.cpp文件中这样做:

m_pView = new QWebEngineView(this);
QWebChannel * channel = new QWebChannel(page);
m_pView->page()->setWebChannel(channel);
channel->registerObject(QString("TheNameOfTheObjectUsed"), this);

在这里,您只需说明您注册了一个名为TheNameOfTheObjectUsed的对象,该对象将在JS端提供。现在,这是JS方面使用的代码部分:

new QWebChannel(qt.webChannelTransport, function (channel) {
            // now you retrieve your object
            var JSobject = channel.objects.TheNameOfTheObjectUsed;
        });

现在,如果你想在JS方面检索类的一些属性,你需要在C ++端有一个方法,它返回一个字符串,一个整数,一个长...这就是它在C ++方面的样子,在你的.h

Q_INVOKABLE int getInt();
Q_PROPERTY(int myIntInCppSide READ getInt);

现在,你在JS方面得到这样的int:

var myIntInJSside= JSobject.myIntInCppSide;

这是一个非常简单的解释,我建议你观看对我来说非常有用的this video。此外,您可能想要阅读有关QWebChannel提供的JavaScript API的更多信息,以及有关QWebChannel的文档。

希望有所帮助!


0
投票

Qt现在有这方面的文件:

Qt WebChannel Standalone Example

您必须将QWebSocketServer添加到您的cpp应用程序,QWebEngineView的HTML / Javascript将使用WebSocket连接到该应用程序。然后使用QWebChannel进行双向通信。

© www.soinside.com 2019 - 2024. All rights reserved.