【问题标题】:Create QML Element in C++?在 C++ 中创建 QML 元素?
【发布时间】:2012-12-30 16:20:35
【问题描述】:

我有以下问题:

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

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

【问题讨论】:

    标签: qt qml qt5 qtquick2


    【解决方案1】:

    不幸的是,文档有点过时(使用 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 引擎是意识到属性变化”。

    接下来,我们需要设置item的所有权,否则JavaScript垃圾处理器会删除你的item,你可以随机seg fault。

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

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

    object->deleteLater();
    

    希望对某人有所帮助!

    【讨论】:

    • 别忘了导入
    【解决方案2】:

    转到此处: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 2018-05-21
      • 2017-08-11
      • 2012-12-31
      • 2013-10-01
      相关资源
      最近更新 更多