【问题标题】:Qt programming: How to extend Javascript API in webkitQt 编程:如何在 webkit 中扩展 Javascript API
【发布时间】:2011-05-14 22:57:53
【问题描述】:

我是 Qt 新手,我想做的是:

  1. 使用 Qt 框架创建 Linux 应用程序。
  2. 此应用显示来自 Internet 的一些网页。
  3. 我想扩展 JavaScript API 以访问一些设备和基于设备的数据,这意味着可以使用 Webkit 中的 JavaScript 控制一些设备。

但是如何在 Qt 中向 Webkit 添加一些自定义函数/类呢?

【问题讨论】:

  • 这是一大堆 Qt 脚本示例:doc.qt.nokia.com/4.7/examples-script.html.
  • 这是this bug 跟踪的正在进行的工作。如果您想尝试此实验性功能,请查看this question 或此maillist thread 中的答案。
  • 但是,Qt Script 能够处理 html+css+javascript 吗?我希望使用我的自定义 javascript API 显示整个网页
  • 您过去的一些问题表明您正在处理设备、基于网络的更新和地图。这是我的公司 (TomTom) 拥有多项专利的领域。选择解决方案后,您可能需要与 IP 律师核实此类解决方案是否侵权。
  • @MSalters 提醒我永远不要购买 TomTom 设备。

标签: javascript c++ qt webkit device


【解决方案1】:

幸运的是,有一些关于此的文档,最后:​​http://doc.qt.io/qt-4.8/qtwebkit-bridge.html

【讨论】:

    【解决方案2】:

    我已经完成了一个 QWebKit 项目,我在其中建立了 Javascript 和我的 C++ 代码之间的桥梁。

    为此,我使用了以下方法:

    this->page()->mainFrame()->addToJavaScriptWindowObject( "god", this );
    

    这允许您使用指定为第一个参数的对象执行您传递给 addToJavaScriptWindowObject 作为 Javascript 的第二个参数的对象的方法。

    这里是一个例子:

    class Browser : public QWebView
    {
         Q_OBJECT
         public:
             Browser( QWidget* parent=0 )
             {
                connect( this->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),    this,   SLOT(onJavaScriptWindowObjectCleared()) );
             }
    
         public slots:
             void onJavaScriptWindowObjectCleared()
             {
              //   QString script = "console.log('init!');";
              //   this->page()->mainFrame()->evaluateJavaScript( script );
             }
    
             void onChange()
             {
                 qDebug() << "Browser::onChange()";
             }
     }
    

    然后,我可以从 Javascript 做:

    $('input:text').keydown( god.onChange );
    

    所以每次我在输入框中按下一个键时,god.onChange() 都会执行,它会执行 Browser::onChange() 槽。

    这样可以避免扩展 JS api。

    【讨论】:

    • 谢谢你,对我很有帮助
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2012-03-10
    • 2014-02-09
    • 1970-01-01
    • 2013-03-29
    • 2023-03-09
    相关资源
    最近更新 更多