用C++创建QML元素?

joe*_*ekr 7 qt qml qt5 qtquick2

我有以下问题:

我将初始界面加载到QQuickView使用.qml文件中.然后我要添加QML类型等的Image或者Text使用C++的接口.

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

use*_*326 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();
Run Code Online (Sandbox Code Playgroud)

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

QQmlProperty::write(object, "parent"
                    , QVariant::fromValue<QObject*>(view.rootObject()));
Run Code Online (Sandbox Code Playgroud)

另外,请注意(再次从上面的链接):" 你应该总是使用QObject :: setProperty(),QDeclarativeProperty或QMetaProperty :: write()来更改QML属性值,以确保QML引擎知道属性更改 ".

接下来,我们需要设置项目的所有权,否则JavaScript垃圾处理程序可以删除您的项目,您可以随机地查询故障.

QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership);
Run Code Online (Sandbox Code Playgroud)

最后,您需要记住删除对象"对象".既然它是QObject你应该使用:

object->deleteLater();
Run Code Online (Sandbox Code Playgroud)

希望有人帮助!

  • 不要忘记导入 &lt;QQuickItem&gt; (2认同)