如何使用 QJSEngine 实例化 c++ 对象

Posted

技术标签:

【中文标题】如何使用 QJSEngine 实例化 c++ 对象【英文标题】:How to instantiate c++ objects with QJSEngine 【发布时间】:2015-02-23 19:16:33 【问题描述】:

是否可以向 QJSEngine(QML 引擎)声明一个 C++ 类,以便可以从 javascript 实例化该类的对象?

到目前为止,我能想到的唯一解决方案是使用 Q_INVOKABLE 创建一个工厂方法,该方法使用 QJSEngine ::newQObject() 返回一个对象

谢谢!

【问题讨论】:

【参考方案1】:

使用Qt.createQmlObject()怎么样?问题是您需要在创建对象时提供父项。另一个无法调用非默认构造函数。

// C++ class (from http://doc.qt.io/qt-5/qtqml-cppintegration-definetypes.html)
class Message : public QObject

    Q_OBJECT
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    Q_PROPERTY(QDateTime creationDate READ creationDate WRITE setCreationDate NOTIFY creationDateChanged)
public:
    // ...
;

// Register the C++ class to be used by QML
qmlRegisterType<Message>("com.mycompany.messaging", 1, 0, "Message");

// Create C++ object from QML JavaScript
var msg = Qt.createQmlObject('import com.mycompany.messaging 1.0; Message ', parentItem);
msg.author = "Kate";

【讨论】:

我想过这样做。运行时 qml 对象的动态创建并不简单,我的预期用途是来自 javascript 中的运行时用户脚本。要跳过很多圈。到目前为止,创建一个可以完成工作的 Q_INVOKABLE 方法似乎更容易和更有效。好主意

以上是关于如何使用 QJSEngine 实例化 c++ 对象的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中,类的实例化对象是指啥?如果确保它的实例化对象只得一个?

如何在特定的 NUMA 内存节点上实例化 C++ 对象?

C++只能实例化1个对象的类

单个应用程序中有多个 QJSEngine 实例?

如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?

在脚本调用的 C++ 函数中调用 QJSEngine::newQObject() 是不是有效?