2012-12-30 42 views
6

我有以下问题:在C++中创建QML元素?

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

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

回答

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); 

最后,您需要记得删除对象“object”。由于它是一个QObject,你应该使用:

object->deleteLater(); 

希望能帮助别人!

+1

别忘了导入 Alan

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。