7

我有以下问题:

我将初始界面加载到QQuickView使用.qml文件中。然后我想使用 C++ 向接口添加QML 类型,如Image或。Text

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

4

2 回答 2

12

不幸的是,文档有点过时(使用 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 垃圾处理程序会删除您的项目,您可以随机 seg fault。

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

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

object->deleteLater();

希望对某人有所帮助!

于 2013-07-04T17:32:27.877 回答
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。

于 2013-08-19T12:37:53.303 回答