如何设置QWebChannel JS API以在QWebEngineView中使用?

Thu*_*orm 4 javascript c++ qt

由于Qt的文档远未完成,这是设置QWebChannel的方法,并且<script>在HTML页面中添加标签与文档中推荐的标签有什么不同?

Thu*_*orm 10

有不同的选项可以加载URL上可访问的所需脚本qrc:///qtwebchannel/qwebchannel.js:

注意:

  • 如果从QWebEngineView中查看页面,则只能使用该URL.否则,您可能需要将API文件加载到Web服务器.

先决条件:

  • 添加QT += webchannel到您的.pro文件并运行qmake

使用runJavaScript()以执行Qt的QWebChannel JS API代码:

我喜欢的方法,因为它看起来很简单,到目前为止一直很可靠.请记住,在此代码完成时可能无法设置API,因为该runJavaScript()方法在JS代码执行之前不会阻塞当前线程.

QFile apiFile(":/qtwebchannel/qwebchannel.js"); //load the API from the resources
if(!apiFile.open(QIODevice::ReadOnly))
    qDebug()<<"Couldn't load Qt's QWebChannel API!";
QString apiScript = QString::fromLatin1(apiFile.readAll());
apiFile.close();
QWebEngineView view;    //your custom QWebEngineView
view.page().runJavaScript(apiScript);
Run Code Online (Sandbox Code Playgroud)

利用runJavaScript()来执行代码加载Qt的QWebChannel JS API:

虽然我没有尝试这些方法,但它们仍然有用,因为它们的目的是加载外部JS文件.这里建议的方法之一可能会派上用场,具体取决于您使用的其他库.

<script>在网页中使用标记:

这是Qt文档推荐的默认方法.它的优点是在页面加载后立即提供API.这样做的缺点是,如果您不是网站的所有者,则需要修改网页的HTML,这可能很痛苦.

不要忘记在C++端创建一个QWebChannel对象:

QWebChannel* channel_ = new QWebChannel(view.page());
//attach it to the QWebEnginePage
view.page()->setWebChannel(channel_);
//register a QObject to be exposed to JavaScript
channel_->registerObject(QStringLiteral("jshelper"), this);
Run Code Online (Sandbox Code Playgroud)

这个答案被认为是Qt文档的补充,所以如果你想添加一些东西,请随意这样做.

版本:Qt 5.6.1

资料来源:

  • ```QFile apiFile(":/qtwebchannel/qwebchannel.js")``` 行应该在 Qt 手册中。 (3认同)
  • 请注意,您仍然需要从JS代码中调用`new QWebChannel(qt.webChannelTransport,function(channel){});`来初始化QWebChannel(在排除`qwebchannel.js`内容之后)。至少对于Qt 5.11,它已经内置了对WebEngine中通道的支持 (2认同)