从 Javascript 端调用 Qt 函数 (QWebView)

2023-11-26

我有一个 Qt 项目,可以将任何 HTML 页面加载到 Web 视图中。我有以下代码main.cpp file:

#include "mainwindow.h"
#include <QApplication>
#include <QWebView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWebView *view = new QWebView();

    view->resize(400, 500);
    view->load(QUrl("file:///absolute/path/to/my/html/file.html"));
    view->show();

    return app.exec();
}

这工作正常,但我想通过加载的 Javascript 从 C++ 端调用一个函数file.html(加载于QWebView).

因此,具有以下 C++ 函数:

void sumOfNumbers (a, b)
{
   qDebug() << a + b;
}

我想从 Javascript 端调用它:

someMethod("sumOfNumber", 12, 23);

将在控制台中打印35(12 + 23)。

我怎样才能做到这一点?


您需要在继承自 QObject 的类中定义要调用的方法。

从 QWebView 中,您可以调用page()检索其 QWebPage。使用 QWebPage,您可以调用mainFrame()检索其 QWebFrame。 QWebFrame 有一个addToJavaScriptWindowObject()方法可以让你将 QObject 绑定到 web 上下文中:

class MyObject {
public slots:
    void doSomething();
};

MyObject *foo = new MyObject;
myWebView->page()->mainFrame()->addJavaScriptToWindowObject("somefoo", foo);

然后,从 javascript 端,我可以通过上面提供的名称(在本例中为“somefoo”)引用 QObject 上的任何插槽或 Q_INVOKABLE 方法来调用它:

somefoo.doSomething();

更多信息请点击这里:http://qt-project.org/doc/qt-5.1/qtwebkit/qwebframe.html#addToJavaScriptWindowObject

Update- 添加原始示例。

主要.cpp:

#include <QApplication>
#include <QDebug>
#include <QWebFrame>
#include <QWebPage>
#include <QWebView>

class MyJavaScriptOperations : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE void sumOfNumbers(int a, int b) {
        qDebug() << a + b;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWebView *view = new QWebView();
    view->resize(400, 500);
    view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", new MyJavaScriptOperations);
    view->load(QUrl("file:///path/to/my/index.html"));
    view->show();

    return a.exec();
}

#include "main.moc"

索引.html:

<html>
    <body>
        <script type="text/javascript">
            myoperations.sumOfNumbers(12, 23);
        </script>
    </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Javascript 端调用 Qt 函数 (QWebView) 的相关文章

随机推荐

  • socket.io 握手返回错误“传输未知”

    我正在尝试使用大象io将事件从我的 PHP 脚本发送到我的 Nodejs 服务器 使用这个库进行测试时 我注意到握手没有按预期发生 After 阅读有关客户端 服务器握手的规范使用socket io 我测试了对我的nodejs服务器的简单握
  • 春豆到底是什么?

    我还没有找到我能理解的 Spring bean 的高级定义 我在 Grails 文档和书籍中经常看到它们被引用 但我认为了解它们是什么会很有帮助 那么什么是Spring bean呢 如何使用它们 它们与依赖注入有什么关系吗 Spring核心
  • Symfony2:仅当复选框为真时,如何验证输入字段不为空?

    在 Symfony2 中 仅当复选框的值为 1 True 时 如何验证输入字段不是空白 否则允许空白 更准确地说 我有一个带有复选框的表单和一个带有文本类型的输入字段 在 Symfony 的实体上应该有一个检查 当复选框的值为 True 1
  • 根据接口生成表达式

    我遇到了例外无法将类型 MySomeTypeThatImplementsISomeInterfaceAndIsPassedAs T ToTheClass 转换为类型 ISomeInterface LINQ to Entities 仅支持转换
  • 重新分区(1) 和合并(1) 之间的区别

    在我们的项目中 我们使用repartition 1 将数据写入表中 我有兴趣知道为什么coalesce 1 不能在这里使用 因为repartition与coalesce I know repartition跨分区均匀分布数据 但是当输出文件
  • 如果使用.remove(),表单将无法提交?

    我对 Firefox jQuery 或两者都感到困扰 操作系统为 Windows 7 Firefox 版本为 4 0 1 jQuery 版本为 1 5 1 6 基本上我有一个表格button其中的元素 通过 jQuery 附加了一个单击事件
  • pandas.read_html 不支持小数逗号

    我正在使用读取 xlm 文件pandas read html并且工作几乎完美 问题是该文件使用逗号作为小数分隔符而不是点 默认在read html 我可以轻松地将一个文件中的逗号替换为点 但我有近 200 个具有该配置的文件 和pandas
  • 使用开发者工具时 IE9 是否启用“某些功能”?

    我正在使用 Google Maps Javascript API V3 最近我的地图上的图标没有显示在 IE9 中 为了弄清真相 我打开了IE的开发者工具 当我刷新地图时 图标出现了 然而 当我关闭 IE 并重新启动时 图标不存在 再一次
  • 没有会话绑定到当前上下文

    我按照这个教程进行操作 http nhforge org blogs nhibernate archive 2011 03 03 effective nhibernate session management for web apps as
  • TokenCache.BeforeAccess 上的 HttpContext.Current 为 null

    我正在使用 OWIN 和 OpenIDConnect 针对 Azure AD 测试一个 Web 项目 我正在使用此示例中的大部分代码 https github com Azure Samples active directory dotne
  • 使用 yyyy-MM-dd hh:mm:ss 格式解析的日期出现意外差异

    我运行下面的java代码来获取时差 import java text SimpleDateFormat import java util Calendar import java util Date import java util Tim
  • 如何找到命名空间及其成员的所有用法?

    我正在尝试搜索一个大型解决方案以查找给定名称空间或其成员的任何用法 例如 System IO Resharper 的 查找用法 允许我查找以下内容的参考System IO 但仅在明确使用时 如果文件声明using System IO 然后使
  • 如何限制递归子目录搜索的深度

    我有一个功能 当前可以抓取所有文件夹和子文件夹来检查我正在构建的小工具的 ACL 但我正在绞尽脑汁试图弄清楚如何限制它可以达到的深度 例如 您有一个 4 层深度的文件夹 但我希望只能获取其中 3 层的 ACL 目前我已将其编码如下 priv
  • Cakephp 使用 htaccess 和 htpasswd 进行密码保护 - 如何?

    在 Cakephp 中使用 htaccess 开发期间如何使用密码保护我的网站 我必须更改哪个 htaccess 文件 我必须在 htaccess 中写什么 我应该把 htpasswd 放在哪里 我在谷歌上搜索过 但找不到任何有用的东西 我
  • 为什么 Array.prototype 返回一个空数组?

    这可能是一个愚蠢的问题 但是为什么当我控制台时我得到一个空数组Array prototype 我期待着推送和弹出方法 大多数原型的内置方法都不是可枚举的 因此如果您使用它们将不会显示for in 你不应该在数组上这样做 但这只是一个例子 由
  • 请解释一下区别

    我有一个关于二维数组的程序 基地址是8678 include
  • 如何通过 php 中的网络服务发送/获取文件

    这可能吗 发送文件的正确方法是什么 thanks 如果您希望网络服务上传 下载文件 我不知道 无论如何你可以使用curl http fr php net curl 从其他网络服务器上传 下载文件 要从用户处获取上传到 Web 服务的某些文件
  • JavaScript 音频的未来?

    我正在教孩子们如何向他们的 JavaScript 游戏和网页添加音频 我了解 HTML5 音频 API 现在刚刚了解各种浏览器的问题 令人惊讶的是 IE 根本不支持 WAV 等 不过 显然有一个新的网络音频标准我不知道 Chrome 完全支
  • 在 PHP 中显示两个日期之间的所有周数[重复]

    这个问题在这里已经有答案了 任何人都可以告诉如何在 PHP 中显示两个日期之间涵盖的所有周数 日期可能是不同的年份 如果我使用开始日期为 2011 09 16 结束日期为 2011 09 21 它将显示第 37 周和第 38 周 你可以使用
  • 从 Javascript 端调用 Qt 函数 (QWebView)

    我有一个 Qt 项目 可以将任何 HTML 页面加载到 Web 视图中 我有以下代码main cpp file include mainwindow h include