如何在QML Javascript中创建和使用C++对象

fol*_*bis 10 javascript qml qt-quick qt5 qtquick2

我的应用程序使用c ++和QML.

我在C++部分定义了几个对象来访问SQL等.

看起来像:

class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject(QObject *parent = 0);
    Q_INVOKABLE void someFunction(const QString &query);
};

qmlRegisterType<MyObject>("xxx.xxx", 1, 0, "MyObject");
Run Code Online (Sandbox Code Playgroud)

理想情况下,我只需要在JML中使用这些对象,而不是在QML中.

我尝试了很多例子并阅读了所有文档,但仍然无法解决我的问题.

所以我的问题:

  • 如何在Javascript中实例化C++中定义的对象?我试过var obj = Qt.createComponent("MyObject");但看起来不行.是否有可能以正常的JS风格定义新对象 - var obj = new MyObject;
  • 如何在javascript中访问此创建的对象?我试过obj.someFunction("xxx")但是有一些错误 - TypeError: Property 'someFunction' of object QQmlComponent(0x3605f5c0) is not a function.我在这里做错了什么?我的对象派生自QObject,而不是来自QQmlComponent.

Dan*_*man 4

文档非常清楚,但混乱看起来像是在等式的 QML 方面。这应该可以帮助您开始:

//C++
class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject(QObject *parent = 0);
    Q_INVOKABLE void someFunction(const QString &query) { qDebug() << query;}
};
....
qmlRegisterType<MyObject>("foo.bar", 1, 0, "MyObject");
Run Code Online (Sandbox Code Playgroud)

QML 如下:

import foo.bar 1.0 //This is your register type
Item {
  MyObject { //here's the instance, remember it is declarative
    id: myObject;
  }
  MyObject {
    id: myObjectInstance2
  }
  Button {
    onClicked: {
      myObject.someFunction("doSomething"); //here is using a reference
      myObjectInstance2.someFunction("doSomethingElse");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

单击后,您应该会在输出中看到字符串(我没有编译或测试它)。请务必在您的主类中注册该类型。

如果您在移动设备上使用 SQL,则应该检查本地存储对象。这是一个非常简单的回调 API,可与 SQLite 配合使用。我将它用于桌面应用程序并且没有遇到太多麻烦。返回列表有点烦人,所以只需尝试坚持简单的类型即可轻松集成 JavaScript。

我希望这有帮助。我非常喜欢在 QML 中工作,一旦你学会了它就会非常有趣(1-2 周就可以足够熟练地工作)。