官方实例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]