美文网首页
qml 附加属性

qml 附加属性

作者: 杯子和盘子 | 来源:发表于2019-03-24 21:26 被阅读0次

今天看qml的例子程序,看到一个attached例子,为qml添加附加对象,这个概念有点难于理解:附加对象主要用来提供附加属性,附加属性是相对静态属性而言的,比如在C++类中用Q_PROPERTY申明的属性属于静态属性。附加属性却可以在尽量不破坏原有类型的基础上,为其添加扩展属性。其应用场景还有待进一步的研究。


添加附加属性的方法

  • 定义自己的附加属性类型:和一般的类型定义一模一样
class ClassAttached : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QDate rsvp READ rsvp WRITE setRsvp)
public:
    ClassAttached (QObject *object);

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

private:
    QDate m_rsvp;
}; 
  • 对需要添加附加属性的类型稍作改动:
    1. 实现static ClassAttached *qmlAttachedProperties(QObject *);接口;
    2. 申明该类拥有附加属性:QML_DECLARE_TYPEINFO(ClassAttatee, QML_HAS_ATTACHED_PROPERTIES)
class ClassAttatee: public QObject
{
    Q_OBJECT
    Q_PROPERTY(Person *host READ host WRITE setHost)
    Q_PROPERTY(QQmlListProperty<Person> guests READ guests)
    Q_CLASSINFO("DefaultProperty", "guests")
public:
    ClassAttatee(QObject *parent = 0);

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

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

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

//! [declare attached]
QML_DECLARE_TYPEINFO(ClassAttatee, QML_HAS_ATTACHED_PROPERTIES)
//! [declare attached]

//qmlAttachedProperties(QObject *)实现如下:
ClassAttached *BirthdayParty::qmlAttachedProperties(QObject *object)
{
    return new ClassAttached (object);
}

这样在qml中就可以用如下方式定义附加属性了:

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

        ClassAttached .rsvp: "2009-07-06"
    }
    // ![1]
    host: Boy {
        name: "Jack Smith"
        shoe { size: 8; color: "blue"; brand: "Puma"; price: 19.95 }
    }
//! [end]
}

总结:

如果在后期需要为ClassAttatee添加属性,就可以在不破坏ClassAttatee类型的前提下,只需在ClassAttatee中添加即可。并且ClassAttatee可以作为多个类型的附加类型,这样就可以统一为多个类型添加附加属性,而不需要为每个类型单独添加。

qml类型提供的默认附加对象

在qml的默认类型中,提供了一些默认的附加类型,典型的有Keys类型:

Item {
      width: 100; height: 100

      focus: true
      Keys.enabled: false
      Keys.onReturnPressed: console.log("Return key was pressed")
  }

我们在定义Item时,可以访问Keys的属性和信号。

相关文章

  • qml 附加属性

    今天看qml的例子程序,看到一个attached例子,为qml添加附加对象,这个概念有点难于理解:附加对象主要用来...

  • C++调用QML代码

    C++调用QML实际上就是通过 QML 对象的指针去访问QML对象的属性和方法 只要获取到QML对象的指针,接下来...

  • QT - QML对象属性

    QML对象属性 每个QML对象类型都有一组定义的属性。使用为该对象类型定义的属性集创建对象类型的每个实例。可以指定...

  • QML Loader 使用注意事项

    QML 的 Loader 元素经常被用来动态加载 QML 组件。可以使用 source 属性或者 sourceCo...

  • Qml 问答

    在Qml 文件中可以访问一个上下文C++实例的属性吗? 可以,但该属性需通过Q_PROPERTY声明 如何在Qml...

  • HTML 属性

    属性是 HTML 元素提供的附加信息。 HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 ...

  • HTML 属性

    属性是 HTML 元素提供的附加信息。 HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 ...

  • 依赖属性 & 附加属性

    一、概述 依赖属性指属性没有值,通过Binding从数据源中获取值 二、使用 2.1 依赖属性 Register ...

  • QML 对象的属性

    以下内容为本人的学习笔记,如需要转载,请声明原文链接 [englyf] https://www.jianshu.c...

  • 去除文件@附加属性

    在网上下载的文件,会有@属性,是系统的安全性设置。 查看附加属性xattr -l filename清楚附加属性xa...

网友评论

      本文标题:qml 附加属性

      本文链接:https://www.haomeiwen.com/subject/nvrpvqtx.html