Qml 之 官方实例 附加属性

官方实例C:\Qt\Qt5.14.2\Examples\Qt-5.14.2\qml\referenceexamples,中演示了很多重要的性质,比如附加属性,数据动态绑定,Q_CLASSINFO、
QQmlProperty、QQmlPropertyValueSource等qml概念,值得好好看看。
本文只是简单记录了下如何使用自定义附加属性,真正的使用场景还需要在实际项目设计中深入思考


官方解释

在QML语言语法中,有附加属性和附加信号处理程序的概念,它们是附加到Qml对象的附加属性。本质上,这些属性由附加的类型来实现和提供,并且这些属性可以附加到另一类型的对象。这与由对象类型本身(或对象的继承类型)提供的普通对象属性形成对比。

import QtQuick 2.0

  Item {
      width: 100; height: 100
      focus: true
      Keys.enabled: false
      Keys.onReturnPressed: console.log("Return key was pressed")
  }

Item对象可以访问和设置键的值。启用和回车按键。这允许Item对象访问这些额外属性,作为其自身现有属性的扩展。


提示:以下是本篇文章正文内容,下面案例可供参考

一、附加属性场景?

附加对象主要用来提供附加属性,附加属性是相对静态属性而言的,比如在C++类中用Q_PROPERTY申明的属性属于静态属性。附加属性却可以在尽量不破坏原有类型的基础上,为其添加扩展属性;

QML类型实现可以选择在C ++中创建具有特定属性和信号的附加类型。然后可以创建这种类型的实例,并在运行时将其附加到特定对象,从而允许那些对象访问附加类型的属性和信号。通过为属性和相应的信号处理程序添加前缀附加类型的名称来访问它们。

附加属性或处理程序的使用语法如下:

.
.on

二、如何自定义附加属性

1.自定义附加属性

定义自己的附加属性类型

class BirthdayPartyAttached : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
    BirthdayPartyAttached(QObject *object);

    QDate rsvp() const;
    void setRsvp(const QDate &);

private:
    QDate m_rsvp;
};

2.需要添加附加属性的类

对需要添加附加属性的类型稍作改动:
实现static ClassAttached *qmlAttachedProperties(QObject *);接口;
申明该类拥有附加属性:

QML_DECLARE_TYPEINFO(ClassAttatee, QML_HAS_ATTACHED_PROPERTIES)
class BirthdayParty : public QObject
{
    Q_OBJECT
    Q_PROPERTY(Person *host READ host WRITE setHost)
    Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
    Q_CLASSINFO("DefaultProperty", "guests")
public:
    BirthdayParty(QObject *parent = nullptr);

    Person *host() const;
    void setHost(Person *);

    QQmlListProperty<Person> guests();
    int guestCount() const;
    Person *guest(int) const;

    //! [static attached]
    static BirthdayPartyAttached *qmlAttachedProperties(QObject *);
    //! [static attached]
private:
    Person *m_host;
    QList<Person *> m_guests;
};

//! [declare attached]
QML_DECLARE_TYPEINFO(BirthdayParty, QML_HAS_ATTACHED_PROPERTIES)
//! [declare attached]
BirthdayPartyAttached *BirthdayParty::qmlAttachedProperties(QObject *object)
{
    return new BirthdayPartyAttached(object);
}

3.qml中使用附加属性

//! [begin]
BirthdayParty {
//! [begin]

//! [rsvp]
    Boy {
        name: "Robert Campbell"
        BirthdayParty.rsvp: "2009-07-01"
    }
//! [rsvp]
    // ![1]
    Boy {
        name: "Leo Hodges"
        shoe { size: 10; color: "black"; brand: "Reebok"; price: 59.95 }

        BirthdayParty.rsvp: "2009-07-06"
    }
    // ![1]
    host: Boy {
        name: "Jack Smith"
        shoe { size: 8; color: "blue"; brand: "Puma"; price: 19.95 }
    }
//! [end]
}
//! [end]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML 中显示 3D 实例需要使用 Qt 3D 模块。以下是一个简单的示例,演示如何在 QML 中显示一个盒子: ```qml import Qt3D.Core 2.14 import Qt3D.Render 2.14 import Qt3D.Input 2.14 import Qt3D.Extras 2.14 Entity { components: [ // 坐标系组件 Transform { translation: Qt.vector3d(0, 0, -10.0) }, // 渲染组件 RenderableEntity { material: DiffuseMapMaterial { // 设置盒子的纹理 diffuse: TextureLoader { source: "qrc:/textures/box.png" } } mesh: BoxMesh { xExtent: 2.0 yExtent: 2.0 zExtent: 2.0 } } ] } ``` 首先,我们导入了 4 个 Qt3D 模块:Qt3D.Core、Qt3D.Render、Qt3D.Input 和 Qt3D.Extras。然后,我们创建了一个实体(Entity),该实体包含了两个组件:Transform 和 RenderableEntity。 Transform 组件用于设置实体的坐标系。在上面的示例中,我们将实体沿着 Z 轴平移了 -10 个单位。这意味着盒子将在屏幕上的深度为 10 的位置显示。 RenderableEntity 组件用于设置实体的渲染,包括材质和网格。在上面的示例中,我们使用了 DiffuseMapMaterial 材质,该材质包含了一个盒子纹理。我们还使用了 BoxMesh 网格,该网格定义了一个矩形盒子,其 x、y 和 z 轴的大小分别为 2.0。 要在您的应用程序中显示此实体,您可以将其添加到 Qt3D 中的场景(Scene)中。例如: ```qml import Qt3D.Core 2.14 import Qt3D.Render 2.14 import Qt3D.Input 2.14 import Qt3D.Extras 2.14 // 创建场景 Scene { Entity { // 添加盒子实体 BoxEntity {} } } ``` 这将创建一个场景,并在场景中添加一个名为“BoxEntity”的实体。现在您可以运行您的应用程序,看到一个显示了 3D 盒子的窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值