如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

Posted

技术标签:

【中文标题】如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?【英文标题】:How to access a C++ class object in QML rather than creating a separate object in QML? 【发布时间】:2014-01-08 10:57:29 【问题描述】:

假设有一个 C++ 类,其中包含信号和一些可从 QML 访问的函数。 现在,为了在 QML 中访问该类的成员,我编写了如下内容:

myClass

   id: abc

   x: 100    
   onXChanged: console.log ("xx");

假设 x 是实际 C++ 类的成员,上述代码确实有效。


现在,我有一个 C++ 类的对象,即在相关 C++ 文件中创建的 myClass

问题:在 QML 中访问和使用已经创建的 C++ 对象,而不是在 QML 中创建同一类的新对象是否可行且合理?

【问题讨论】:

【参考方案1】:

您可以为此使用上下文属性。你会这样写:

...

MyClass myClassObject;
QQuickView view;
view.rootContext()->setContextProperty("myClassContextProperty", &myClassObject);
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();

...

然后你可以在 qml 中访问它,如下所示:

Button 
    onClicked: myClassContextProperty.x = 100

【讨论】:

以上是关于如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 访问特定 QML 控件的事件

在 QML 中创建自定义 C++ 对象并将其存储在 C++ 模型中

如何有效地将单个对象的多个 C++ 数据成员公开给 QML?

在没有 Q_PROPERTY 定义的情况下从 C++ 访问 QML 对象的属性

如何从 C++ 代码将 QML 对象转换为 QQuickWindow?

QML 未能检测到在 C++ 中破坏的 QObject