今天看qml的例子程序掸哑,看到一個attached例子窿撬,為qml添加附加對象蔗草,這個概念有點難于理解:附加對象主要用來提供附加屬性咒彤,附加屬性是相對靜態(tài)屬性而言的,比如在C++類中用Q_PROPERTY
申明的屬性屬于靜態(tài)屬性咒精。附加屬性卻可以在盡量不破壞原有類型的基礎上镶柱,為其添加擴展屬性。其應用場景還有待進一步的研究模叙。
添加附加屬性的方法
- 定義自己的附加屬性類型:和一般的類型定義一模一樣
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;
};
- 對需要添加附加屬性的類型稍作改動:
- 實現(xiàn)
static ClassAttached *qmlAttachedProperties(QObject *);
接口歇拆; - 申明該類擁有附加屬性:
QML_DECLARE_TYPEINFO(ClassAttatee, QML_HAS_ATTACHED_PROPERTIES)
- 實現(xiàn)
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 *)實現(xiàn)如下:
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]
}
總結(jié):
如果在后期需要為ClassAttatee
添加屬性,就可以在不破壞ClassAttatee
類型的前提下范咨,只需在ClassAttatee
中添加即可故觅。并且ClassAttatee
可以作為多個類型的附加類型,這樣就可以統(tǒng)一為多個類型添加附加屬性渠啊,而不需要為每個類型單獨添加输吏。
qml類型提供的默認附加對象
在qml的默認類型中,提供了一些默認的附加類型替蛉,典型的有Keys
類型:
Item {
width: 100; height: 100
focus: true
Keys.enabled: false
Keys.onReturnPressed: console.log("Return key was pressed")
}
我們在定義Item時贯溅,可以訪問Keys的屬性和信號。