用C ++创建QML元素?

时间:2012-12-30 16:20:36

标签: qt qml qt5 qtquick2

我有以下问题:

我使用QQuickView文件将初始界面加载到.qml。 然后,我想使用C ++将QML types添加到接口ImageText

我知道我可以操纵C ++中的现有元素但是如何创建新类型并添加它们呢?

2 个答案:

答案 0 :(得分:10)

不幸的是,文档有点过时(使用Qt4 api),但如果您在此处阅读从C ++加载QML组件部分:https://doc.qt.io/qt-4.8/qtbinding.html

然后你应该有类似的东西(使用Qt5 api):

QQuickView view;
view.setSource(QUrl::fromLocalFile("MyView.qml"));
QQmlComponent component(view.engine()
        , QUrl::fromLocalFile("MyItem.qml"));
QObject *object = component.create();

这为您提供了.qml文件中的QObject,但缺少的是如何将其添加到视图中。在qml中,除非它们是视图的父级,否则不会绘制项目。一种方法是将项添加到根上下文中,如下所示:

QQmlProperty::write(object, "parent"
                    , QVariant::fromValue<QObject*>(view.rootObject()));

另外,请注意(再次从上面的链接):“你应该总是使用QObject :: setProperty(),QDeclarativeProperty或QMetaProperty :: write()来改变QML属性值,以确保QML引擎是了解财产变更“。

接下来,我们需要设置项目的所有权,否则JavaScript垃圾处理程序可以删除你的项目,你可以随机地查看错误。

QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);

最后,您需要记住删除对象“对象”。因为它是QObject,你应该使用:

object->deleteLater();

希望能帮助别人!

答案 1 :(得分:1)

转到此处:http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html,滚动到底部并查看标题“使用QtQuick模块定义可视项目”

这让你知道应该怎么做。

此链接提供了如何完成的示例(认为它是针对Qt 4.7编写的,但它与Qt 5没有太大区别):http://developer.nokia.com/Community/Wiki/Creating_a_custom_QML_element_with_Qt


注意:不要忘记使用(继承) QQuickItem 类而不是QDeclarativeItem。