19#include <private/qglobal_p.h>
22#include <qmetaobject.h>
23#include <qscopedvaluerollback.h>
26#include <QtCore/QVarLengthArray>
43
44
45
46
47
51 QPropertyObserver *d =
nullptr;
64 inline QPropertyObserver *
operator ->();
67using PendingBindingObserverList = QVarLengthArray<QPropertyBindingPrivatePtr>;
79 return ptr->binding();
84 auto &d = ptr->d_ref();
85 observer->prev =
reinterpret_cast<QPropertyObserver**>(&d);
86 d =
reinterpret_cast<quintptr>(observer);
121 QPropertyObserver *
next()
const {
return m_placeHolder.next.data(); }
129 QPropertyObserver *
ptr =
nullptr;
134#if QT_DEPRECATED_SINCE(6
, 6
)
135 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
136 if (ptr->next.tag() == QPropertyObserver::ObserverIsAlias)
137 ptr->aliasData =
nullptr;
144#if QT_DEPRECATED_SINCE(6
, 6
)
145 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
146 Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsAlias);
154 Q_ASSERT(ptr->next.tag() != QPropertyObserver::ObserverIsPlaceholder);
155 ptr->binding = binding;
156 ptr->next.setTag(QPropertyObserver::ObserverNotifiesBinding);
164 void notify(QUntypedPropertyData *propertyDataPtr);
170 void evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
179 Q_ASSERT(ptr->next.tag() == QPropertyObserver::ObserverNotifiesBinding);
187 ptr->next->prev =
ptr->prev;
189 ptr->prev.setPointer(
ptr->next.data());
219
220
221
222
223
224
241
242
243
244
245
246
264 friend struct QPropertyBindingDataPointer;
265 friend class QPropertyBindingPrivatePtr;
267 using ObserverArray = std::array<QPropertyObserver, 4>;
272 bool updating =
false;
273 bool hasStaticObserver =
false;
274 bool pendingNotify =
false;
275 bool hasBindingWrapper:1;
277 bool isQQmlPropertyBinding:1;
279
280
281
284 const QtPrivate::BindingFunctionVTable *vtable;
287 QtPrivate::QPropertyObserverCallback staticObserverCallback =
nullptr;
288 QtPrivate::QPropertyBindingWrapper staticBindingWrapper;
290 ObserverArray inlineDependencyObservers;
292 QPropertyObserverPointer firstObserver;
293 std::unique_ptr<std::vector<QPropertyObserver>> heapObservers;
296 QUntypedPropertyData *propertyDataPtr =
nullptr;
299
300
301
302
303
304
305 using DeclarativeErrorCallback =
void(*)(QPropertyBindingPrivate *);
307 QPropertyBindingSourceLocation location;
309 std::byte declarativeExtraData[
sizeof(QPropertyBindingSourceLocation) -
sizeof(DeclarativeErrorCallback)];
310 DeclarativeErrorCallback errorCallBack;
314 QPropertyBindingError m_error;
319 static constexpr size_t getSizeEnsuringAlignment() {
320 constexpr auto align =
alignof (std::max_align_t) - 1;
321 constexpr size_t sizeEnsuringAlignment = (
sizeof(QPropertyBindingPrivate) + align) & ~align;
322 static_assert (sizeEnsuringAlignment %
alignof (std::max_align_t) == 0,
323 "Required for placement new'ing the function behind it.");
324 return sizeEnsuringAlignment;
329 size_t dependencyObserverCount = 0;
331 bool isUpdating() {
return updating;}
332 void setSticky(
bool keep =
true) {m_sticky = keep;}
333 bool isSticky() {
return m_sticky;}
334 void scheduleNotify() {pendingNotify =
true;}
336 QPropertyBindingPrivate(QMetaType metaType,
const QtPrivate::BindingFunctionVTable *vtable,
337 const QPropertyBindingSourceLocation &location,
bool isQQmlPropertyBinding=
false)
338 : hasBindingWrapper(
false)
339 , isQQmlPropertyBinding(isQQmlPropertyBinding)
345 ~QPropertyBindingPrivate();
348 void setProperty(QUntypedPropertyData *propertyPtr) { propertyDataPtr = propertyPtr; }
349 void setStaticObserver(QtPrivate::QPropertyObserverCallback callback, QtPrivate::QPropertyBindingWrapper bindingWrapper)
351 Q_ASSERT(!(callback && bindingWrapper));
353 hasStaticObserver =
true;
354 hasBindingWrapper =
false;
355 staticObserverCallback = callback;
356 }
else if (bindingWrapper) {
357 hasStaticObserver =
false;
358 hasBindingWrapper =
true;
359 staticBindingWrapper = bindingWrapper;
361 hasStaticObserver =
false;
362 hasBindingWrapper =
false;
363 staticObserverCallback =
nullptr;
366 void prependObserver(QPropertyObserverPointer observer)
368 observer.ptr->prev =
const_cast<QPropertyObserver **>(&firstObserver.ptr);
369 firstObserver = observer;
372 QPropertyObserverPointer takeObservers()
374 auto observers = firstObserver;
375 firstObserver.ptr =
nullptr;
379 void clearDependencyObservers();
381 Q_ALWAYS_INLINE QPropertyObserverPointer allocateDependencyObserver() {
382 if (dependencyObserverCount < inlineDependencyObservers.size()) {
383 ++dependencyObserverCount;
384 return {&inlineDependencyObservers[dependencyObserverCount - 1]};
386 return allocateDependencyObserver_slow();
389 QPropertyObserverPointer allocateDependencyObserver_slow();
391 QPropertyBindingSourceLocation sourceLocation()
const
393 if (!hasCustomVTable())
396 constexpr auto msg =
"Custom location";
397 QPropertyBindingSourceLocation result;
398 result.fileName = msg;
402 QPropertyBindingError bindingError()
const {
return m_error; }
403 QMetaType valueMetaType()
const {
return metaType; }
405 void unlinkAndDeref();
407 bool evaluateRecursive(PendingBindingObserverList &bindingObservers, QBindingStatus *status =
nullptr);
409 Q_ALWAYS_INLINE
bool evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status);
411 void notifyNonRecursive(
const PendingBindingObserverList &bindingObservers);
412 enum NotificationState :
bool { Delayed, Sent };
413 NotificationState notifyNonRecursive();
415 static QPropertyBindingPrivate *get(
const QUntypedPropertyBinding &binding)
416 {
return static_cast<QPropertyBindingPrivate *>(binding.d.data()); }
418 void setError(QPropertyBindingError &&e)
419 { m_error = std::move(e); }
421 void detachFromProperty()
423 hasStaticObserver =
false;
424 hasBindingWrapper =
false;
425 propertyDataPtr =
nullptr;
426 clearDependencyObservers();
429 static QPropertyBindingPrivate *currentlyEvaluatingBinding();
431 bool hasCustomVTable()
const
433 return vtable->size == 0;
436 static void destroyAndFreeMemory(QPropertyBindingPrivate *priv) {
437 if (priv->hasCustomVTable()) {
440 priv->vtable->destroy(priv);
442 priv->~QPropertyBindingPrivate();
443 delete[]
reinterpret_cast<std::byte *>(priv);
450 if (
auto *b = binding()) {
451 b->firstObserver.ptr = observer;
454 auto &d = ptr->d_ref();
455 d =
reinterpret_cast<quintptr>(observer);
460 auto &d = ptr->d_ref();
461 if (ptr->isNotificationDelayed()) {
462 QPropertyProxyBindingData *proxy = ptr->proxyData();
464 proxy->originalBindingData = ptr;
469 if (d & QtPrivate::QPropertyBindingData::BindingBit)
471 if (
auto observer =
reinterpret_cast<QPropertyObserver *>(d))
472 observer->prev =
reinterpret_cast<QPropertyObserver **>(&d);
477 if (
auto *b = binding())
478 return b->firstObserver;
479 return {
reinterpret_cast<QPropertyObserver *>(ptr->d()) };
483
484
485
488 if (!ptr->isNotificationDelayed())
490 return ptr->proxyData();
506template<
typename Class,
typename T,
auto Offset,
auto Setter,
auto Signal =
nullptr,
507 auto Getter =
nullptr>
510 template<
typename Property,
typename>
514 using SignalTakesValue =
std::is_invocable<
decltype(Signal), Class, T>;
517 char *that =
reinterpret_cast<
char *>(
this);
518 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
520 const Class *owner()
const
522 char *that =
const_cast<
char *>(
reinterpret_cast<
const char *>(
this));
523 return reinterpret_cast<Class *>(that - QtPrivate::detail::getOffset(Offset));
526 static bool bindingWrapper(QMetaType type, QUntypedPropertyData *dataPtr, QtPrivate::QPropertyBindingFunction binding)
528 auto *thisData =
static_cast<ThisType *>(dataPtr);
529 QBindingStorage *storage = qGetBindingStorage(thisData->owner());
533 if (!binding.vtable->call(type, ©, binding.functor))
538 (thisData->owner()->*Setter)(copy.valueBypassingBindings());
541 bool inBindingWrapper(
const QBindingStorage *storage)
const
543 return storage->bindingStatus && storage->bindingStatus->currentCompatProperty
544 && QtPrivate::isPropertyInBindingWrapper(
this);
547 inline static T getPropertyValue(
const QUntypedPropertyData *d) {
548 auto prop =
static_cast<
const ThisType *>(d);
549 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
550 return prop->value();
552 return (prop->owner()->*Getter)();
555 inline static T getPropertyValueBypassingBindings(
const QUntypedPropertyData *d) {
556 auto prop =
static_cast<
const ThisType *>(d);
557 if constexpr (
std::is_null_pointer_v<
decltype(Getter)>)
558 return prop->valueBypassingBindings();
560 return (prop->owner()->*Getter)();
563 inline static void warnIfSignalWithArgumentAndCustomGetter()
565 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>
566 && SignalTakesValue::value
567 && !
std::is_null_pointer_v<
decltype(Getter)>) {
580 warnIfSignalWithArgumentAndCustomGetter();
584 warnIfSignalWithArgumentAndCustomGetter();
589 const QBindingStorage *storage = qGetBindingStorage(owner());
591 if (storage->bindingStatus && storage->bindingStatus->currentlyEvaluatingBinding && !inBindingWrapper(storage))
592 storage->registerDependency_helper(
this);
598 if constexpr (QTypeTraits::is_dereferenceable_v<T>) {
600 }
else if constexpr (
std::is_pointer_v<T>) {
620 QBindingStorage *storage = qGetBindingStorage(owner());
621 if (
auto *bd = storage->bindingData(
this)) {
623 if (bd->hasBinding() && !inBindingWrapper(storage))
624 bd->removeBinding_helper();
637 QtPrivate::QPropertyBindingData *bd = qGetBindingStorage(owner())->bindingData(
this,
true);
640 return static_cast<QPropertyBinding<T> &>(oldBinding);
645 if (!newBinding.isNull() && newBinding.valueMetaType() != QMetaType::fromType<T>())
652 template <
typename Functor>
655 std::enable_if_t<std::is_invocable_v<Functor>> * =
nullptr)
665 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
666 return bd && bd->binding() !=
nullptr;
671 QBindingStorage *storage = qGetBindingStorage(owner());
672 if (
auto *bd = storage->bindingData(
this)) {
674 if (bd->hasBinding() && !inBindingWrapper(storage))
675 bd->removeBinding_helper();
681 QBindingStorage *storage = qGetBindingStorage(owner());
682 if (
auto bd = storage->bindingData(
this,
false)) {
686 if (!bd->isNotificationDelayed()) {
689 if (!inBindingWrapper(storage)) {
690 PendingBindingObserverList bindingObservers;
691 if (bd->notifyObserver_helper(
this, storage, observer, bindingObservers)
692 == QtPrivate::QPropertyBindingData::Evaluated) {
696 bd = storage->bindingData(
this,
false);
700 for (
auto&& bindingPtr: bindingObservers) {
701 auto *binding =
static_cast<QPropertyBindingPrivate *>(bindingPtr.get());
702 binding->notifyNonRecursive();
709 if constexpr (!
std::is_null_pointer_v<
decltype(Signal)>) {
710 if constexpr (SignalTakesValue::value)
711 (owner()->*Signal)(getPropertyValueBypassingBindings(
this));
713 (owner()->*Signal)();
719 auto *bd = qGetBindingStorage(owner())->bindingData(
this);
720 return static_cast<
QPropertyBinding<T> &&>(QUntypedPropertyBinding(bd ? bd->binding() :
nullptr));
728 template<
typename Functor>
731 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
735 template<
typename Functor>
738 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
740 return onValueChanged(f);
743 template<
typename Functor>
746 static_assert(
std::is_invocable_v<Functor>,
"Functor callback must be callable without any parameters");
752 auto *storage =
const_cast<QBindingStorage *>(qGetBindingStorage(owner()));
785#define QT_OBJECT_COMPAT_PROPERTY_4(Class, Type, name, setter)
786 static constexpr size_t _qt_property_##name##_offset() {
787 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
788 return offsetof(Class, name);
791 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name;
793#define QT_OBJECT_COMPAT_PROPERTY_5(Class, Type, name, setter, signal)
794 static constexpr size_t _qt_property_##name##_offset() {
795 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
796 return offsetof(Class, name);
799 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name;
801#define Q_OBJECT_COMPAT_PROPERTY(...)
802 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
803 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY, __VA_ARGS__)
806#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_5(Class, Type, name, setter, value)
807 static constexpr size_t _qt_property_##name##_offset() {
808 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
809 return offsetof(Class, name);
812 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter> name =
813 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter>(
816#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_6(Class, Type, name, setter, signal, value)
817 static constexpr size_t _qt_property_##name##_offset() {
818 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
819 return offsetof(Class, name);
822 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal> name =
823 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
826#define QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS_7(Class, Type, name, setter, signal, getter, value)
827 static constexpr size_t _qt_property_##name##_offset() {
828 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
829 return offsetof(Class, name);
832 QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter, signal, getter>
833 name = QObjectCompatProperty<Class, Type, Class::_qt_property_##name##_offset, setter,
834 signal, getter>(value);
836#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
837 QT_WARNING_PUSH QT_WARNING_DISABLE_INVALID_OFFSETOF
838 QT_OVERLOADED_MACRO(QT_OBJECT_COMPAT_PROPERTY_WITH_ARGS, __VA_ARGS__)
856 return bindable.data;
860inline bool QPropertyBindingPrivate::evaluateRecursive_inline(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
863 m_error = QPropertyBindingError(QPropertyBindingError::BindingLoop);
864 if (isQQmlPropertyBinding)
870
871
872
873
874
875
876
877 QPropertyBindingPrivatePtr keepAlive {
this};
879 QScopedValueRollback<
bool> updateGuard(updating,
true);
881 QtPrivate::BindingEvaluationState evaluationFrame(
this, status);
883 auto bindingFunctor =
reinterpret_cast<std::byte *>(
this) +
884 QPropertyBindingPrivate::getSizeEnsuringAlignment();
885 bool changed =
false;
886 if (hasBindingWrapper) {
887 changed = staticBindingWrapper(metaType, propertyDataPtr,
888 {vtable, bindingFunctor});
890 changed = vtable->call(metaType, propertyDataPtr, bindingFunctor);
894 pendingNotify = pendingNotify || changed;
895 if (!changed || !firstObserver)
898 firstObserver.noSelfDependencies(
this);
899 firstObserver.evaluateBindings(bindingObservers, status);
904
905
906
907
908
909
910
913 auto observer =
const_cast<QPropertyObserver*>(
ptr);
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
932 QPropertyObserver *next = observer->next.data();
933 switch (QPropertyObserver::ObserverTag(observer->next.tag())) {
934 case QPropertyObserver::ObserverNotifiesChangeHandler:
936 auto handlerToCall = observer->changeHandler;
938 if (next && next->next.tag() == QPropertyObserver::ObserverIsPlaceholder) {
939 observer = next->next.data();
944 handlerToCall(observer, propertyDataPtr);
948 case QPropertyObserver::ObserverNotifiesBinding:
950 case QPropertyObserver::ObserverIsPlaceholder:
953#if QT_DEPRECATED_SINCE(6
, 6
)
954 QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
955 case QPropertyObserver::ObserverIsAlias:
959 default: Q_UNREACHABLE();
982 QPropertyBindingPrivate *bindingPrivate = binding();
983 if (!bindingPrivate->deref())
984 QPropertyBindingPrivate::destroyAndFreeMemory(bindingPrivate);
994 QPropertyBindingData bindingData_;
996 QMetaProperty metaProperty_;
998#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
1001 static void impl(QSlotObjectBase *this_, QObject *r,
void **a,
int which,
bool *ret);
1004 QPropertyAdaptorSlotObject(QObject *o,
const QMetaProperty& p);
1009 if (ptr->isImpl(&QPropertyAdaptorSlotObject::impl)) {
1011 if (p->metaProperty_.propertyIndex() == propertyIndex)
\macro Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)
QPropertyBinding< T > binding() const
operator parameter_type() const
typename QPropertyData< T >::value_type value_type
QtPrivate::QPropertyBindingData & bindingData() const
QObjectCompatProperty & operator=(parameter_type newValue)
typename QPropertyData< T >::arrow_operator_result arrow_operator_result
typename QPropertyData< T >::parameter_type parameter_type
parameter_type value() const
QPropertyChangeHandler< Functor > onValueChanged(Functor f)
void setValue(parameter_type t)
void removeBindingUnlessInWrapper()
bool setBinding(const QUntypedPropertyBinding &newBinding)
QPropertyBinding< T > setBinding(Functor &&f, const QPropertyBindingSourceLocation &location=QT_PROPERTY_DEFAULT_BINDING_LOCATION, std::enable_if_t< std::is_invocable_v< Functor > > *=nullptr)
arrow_operator_result operator->() const
QObjectCompatProperty(T &&initialValue)
QPropertyNotifier addNotifier(Functor f)
parameter_type operator*() const
QObjectCompatProperty(const T &initialValue)
QPropertyBinding< T > takeBinding()
QPropertyChangeHandler< Functor > subscribe(Functor f)
QPropertyBinding< T > setBinding(const QPropertyBinding< T > &newBinding)
~QTimerPrivate() override
QTimerPrivate(QTimer *qq)
void setIntervalDuration(std::chrono::nanoseconds nsec)
static constexpr int INV_TIMER
void setInterval(int msec)
QTimerPrivate(std::chrono::nanoseconds nsec, QChronoTimer *qq)
const QtPrivate::QBindableInterface * iface
QPrivateSlotObject(Func f)
QPropertyBindingData & bindingData()
friend class QT_PREPEND_NAMESPACE(QUntypedBindable)
const QMetaProperty & metaProperty() const
static QPropertyAdaptorSlotObject * cast(QSlotObjectBase *ptr, int propertyIndex)
const QPropertyBindingData & bindingData() const
Combined button and popup list for selecting options.
Q_CORE_EXPORT void printSignalArgumentsWithCustomGetter()
void assertObjectType(QObjectPrivate *d)
Q_CORE_EXPORT bool isAnyBindingEvaluating()
Q_CORE_EXPORT void restoreBindingStatus(BindingEvaluationState *status)
const QObject * getQObject(const QObjectPrivate *d)
Q_CORE_EXPORT bool isPropertyInBindingWrapper(const QUntypedPropertyData *property)
#define QT_CONCAT(B, M, m, u)
QBindingStorage * qGetBindingStorage(QObjectPrivate *o)
QBindingStorage * qGetBindingStorage(QObjectPrivate::ExtraData *ed)
const QBindingStorage * qGetBindingStorage(const QObjectPrivate *o)
#define Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(...)
#define QT_PROPERTY_DEFAULT_BINDING_LOCATION
#define Q_OBJECT_COMPUTED_PROPERTY(Class, Type, name, ...)
#define Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(...)
QBindingObserverPtr()=default
QPropertyObserver * operator->()
QPropertyBindingPrivate * binding() const noexcept
static QPropertyProxyBindingData * proxyData(QtPrivate::QPropertyBindingData *ptr)
static void fixupAfterMove(QtPrivate::QPropertyBindingData *ptr)
Q_ALWAYS_INLINE void addObserver(QPropertyObserver *observer)
const QtPrivate::QPropertyBindingData * ptr
int observerCount() const
static QPropertyBindingDataPointer get(QProperty< T > &property)
QPropertyBindingPrivate * binding() const
void setObservers(QPropertyObserver *observer)
QPropertyObserverPointer firstObserver() const
void setFirstObserver(QPropertyObserver *observer)
~QPropertyObserverNodeProtector()
QPropertyObserver * next() const
void noSelfDependencies(QPropertyBindingPrivate *binding)
void notify(QUntypedPropertyData *propertyDataPtr)
QPropertyBindingPrivate * binding() const
void evaluateBindings(PendingBindingObserverList &bindingObservers, QBindingStatus *status)
void observeProperty(QPropertyBindingDataPointer property)
QPropertyObserverPointer nextObserver() const
void setBindingToNotify_unsafe(QPropertyBindingPrivate *binding)
void setChangeHandler(QPropertyObserver::ChangeHandler changeHandler)
void setBindingToNotify(QPropertyBindingPrivate *binding)
void(* BeginCallback)(QObject *caller, int signal_or_method_index, void **argv)
BeginCallback slot_begin_callback
EndCallback slot_end_callback
EndCallback signal_end_callback
BeginCallback signal_begin_callback
void(* EndCallback)(QObject *caller, int signal_or_method_index)
static QtPrivate::QBindableInterface const * getInterface(const QUntypedBindable &bindable)
static QUntypedPropertyData * getPropertyData(const QUntypedBindable &bindable)
QPropertyBindingPrivate * binding
QVarLengthArray< const QPropertyBindingData *, 8 > alreadyCaptureProperties
BindingEvaluationState(QPropertyBindingPrivate *binding, QBindingStatus *status)
BindingEvaluationState * previousState
~BindingEvaluationState()
BindingEvaluationState ** currentState
QtPrivate::BindingEvaluationState ** currentlyEvaluatingBindingList
CompatPropertySafePoint * previousState
CompatPropertySafePoint ** currentState
~CompatPropertySafePoint()
QUntypedPropertyData * property
QtPrivate::BindingEvaluationState * bindingState