实现附加对象:不清楚的文档示例



我尝试理解文档部分为数据注释提供附加对象,或者具体来说就是一个例子。

如果我的步骤正确,它的工作原理是这样的:

  1. 创建一个类型(MessageBoardAttatchedType(,该类型包含可通过附加属性访问的信号和属性
  2. 创建一个静态方法,该方法返回类型中提到的 affore 类型的实例,该实例应用作附加属性 (MessageBoard(
  3. 通过调用宏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附加类型和多个其他类型完成的方式。

StackViewqmlAttachedProperties无条件地返回一个对象:

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";
}
}

最新更新