我有以下问题:在C++中创建QML元素?
我使用.qml
文件将初始界面加载到QQuickView
。 然后,我想添加QML types,如Image
或Text
到使用C++的接口。
我知道我可以操纵C++中的现有元素,但我如何创建新类型并添加它们?
我有以下问题:在C++中创建QML元素?
我使用.qml
文件将初始界面加载到QQuickView
。 然后,我想添加QML types,如Image
或Text
到使用C++的接口。
我知道我可以操纵C++中的现有元素,但我如何创建新类型并添加它们?
不幸的是,文档是有点乱日期(使用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();
希望能帮助别人!
去这里: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。
别忘了导入 –
Alan