我尝试理解文档部分为数据注释提供附加对象,或者具体来说就是一个例子。
如果我的步骤正确,它的工作原理是这样的:
- 创建一个类型(
MessageBoardAttatchedType
(,该类型包含可通过附加属性访问的信号和属性 - 创建一个静态方法,该方法返回类型中提到的 affore 类型的实例,该实例应用作附加属性 (
MessageBoard
( - 通过调用宏
QML_DECLARE_TYPEINFO(..., QML_HAS_ATTACHED_PROPERTIES)
提供此附加类型存在的信息
我提出了以下问题:
(次要的(:在文档中,我们有以下代码:
static MessageBoard *qmlAttachedProperties(QObject *object)
{
return new MessageBoardAttachedType(object);
}
返回类型是MessageBoard
,但我们返回一个MessageBoardAttachedType
。这怎么可能?MessageBoardAttachedType
并不固有MessageBoard
- 这是 3 中宏的一些魔力吗?
主要问题是:
在这里,我们了解到,附加属性可能(?(仅在非常特定的Items
中可用 - 例如,仅在XView
附加属性的委托根中可用。
在示例中没有提到,我可以从Message
对象访问附加的属性。这是如何确定的?通过null
从
*qmlAttachedProperties(...)
如果通过的*object
不让我满意(例如不是Message
(?
从qmlAttachedProperties
返回空指针将使 QML 引擎崩溃。 您应该始终在qmlAttachedProperties
中返回对象的实例。
但是,当要附加的对象不符合您的要求时,可以在qmlAttachedProperties
函数或附加类型的构造函数中显示警告。
例如,这就是对StackView
附加类型和多个其他类型完成的方式。
StackView
的qmlAttachedProperties
无条件地返回一个对象:
QQuickStackViewAttached *QQuickStackView::qmlAttachedProperties(QObject *object)
{
return new QQuickStackViewAttached(object);
}
如果附加对象不是QQuickItem
,则附加类型的StackView
构造函数会输出警告(与qobject_cast
一起检查(,并且只有在它是时才执行其魔术。
QQuickStackViewAttached::QQuickStackViewAttached(QObject *parent)
: QObject(*(new QQuickStackViewAttachedPrivate), parent)
{
Q_D(QQuickStackViewAttached);
QQuickItem *item = qobject_cast<QQuickItem *>(parent);
if (item) {
connect(item, &QQuickItem::visibleChanged, this, &QQuickStackViewAttached::visibleChanged);
QQuickItemPrivate::get(item)->addItemChangeListener(d, QQuickItemPrivate::Parent);
d->itemParentChanged(item, item->parentItem());
} else if (parent) {
qmlWarning(parent) << "StackView must be attached to an Item";
}
}