【问题标题】:Can QObject be made callable from Java ScriptQObject 可以从 Java 脚本中调用吗
【发布时间】:2013-02-28 17:09:07
【问题描述】:

是否可以让 QObject 可以从 Java Script 调用? 我的意思是像这样注册 QObject 派生类实例:

QObject* obj = new MyObject();
QJSValue js_value = js_engine.newQObject(obj);

js_engine.globalObject().setProperty("myFunction", js_value);

然后能够从 Java Script 调用 myFunction

myFunction()

环境:Qt 5.0.1

编辑:此操作的主要目的是在 Java Script 引擎中注册 C++ 函数或仿函数,并使其不是作为对象的属性而是作为独立函数使用。

【问题讨论】:

  • make QObject callable 是什么意思?使其成员函数可访问?根据您的标签列表:您是否尝试从 QML 属性绑定中的 JavaScript 访问您的 C++ 对象之一?
  • 而Qt提供了一个很好的例子:apidocs.meego.com/1.2/qt4/webkit-imageanalyzer.html
  • axxel,我在 callable 下的意思是当 QJSValue::isCallable() 返回 true 时。反过来,这意味着可以从 JS 调用该对象。不仅是其中一种方法,还有对象本身。
  • @Maxym,C++ 对象不能被称为自身。无论是在 C++ 中还是在 JS 中。可以调用方法。在我看来,您想调用 obj 类的某些方法。正如之前提到的 axxel。

标签: qt qml qt5 qt-quick qtquick2


【解决方案1】:

我认为直接从 C++ 向 QJSEngine globalObject 添加函数是不可能的。虽然这个技巧有效:

  1. 使用要公开给 QJSEngine 的 Q_INVOKABLE 函数定义一个基于 QObject 的类。

    class MyObject : public QObject 
    {
        Q_OBJECT
    public:
        Q_INVOKABLE int myFunction(int x) 
        {
            return x + 3;
        }
    };
    
  2. 创建此对象的实例并从 C++ 定义其父对象。 (为对象实例定义父对象很重要。没有父对象,QJSEngine 会认为它拥有该对象并可以删除它!)

    MyObject *obj = new MyObject();
    obj->setParent(QCoreApplication::instance());
    
  3. 将您的对象暴露给 QJSEngine。

    js_engine.globalObject().setProperty("myObject", js_engine.newQObject(obj));
    
  4. 将对象的函数从 JavaScript 传递给全局对象。

     engine.evaluate("this.myFunction = myObject.myFunction");
    
  5. 从 JavaScript 环境中删除 myObject。

     engine.evaluate("delete myObject");
    

完成!

【讨论】:

    【解决方案2】:

    我花了太多时间尝试做同样的事情。现在我 99.9% 确信当前的 Qt 版本 (5.0.1) 不可能做到这一点。

    【讨论】:

    • 好的,看起来像这样。谢谢!否定的答案也是一个答案。
    【解决方案3】:

    如果您使用的是 Qt5,您可以使用:

    QObject* obj = new MyObject();
    js_engine.globalObject().setProperty("myFunction", js_engine.toScriptValue(&obj::myFunction));
    

    并且您需要您的 QObject 派生类在每个必须公开的方法上都有 Q_OBJECT 宏和 Q_INVOKABLE

    如果你使用 QML,你最好使用QQmlContext::setContextObject

    youQmlContext.setContextObject(new MyObject());
    

    因此,MyObject 类的所有 Q_PROPERTY、Q_INVOKABLE 和 Q_SLOT 成员都将作为上下文本身的成员提供给 QML/JS 引擎。

    【讨论】:

    • 什么是&obj::myFunction? 'obj' 是一个指针。这可以编译吗?
    • 仍然,你在这下面是什么意思?成员函数的地址?那么我不明白它会在哪个对象上被调用。
    • 算了,我以为我们可以将一个类的成员函数注册到 JsEngine,但只有 Qml Engine 允许这样做。
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多