From 3d7265db9075db7b22b241b659f23d392d62d804 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 15 Apr 2020 20:23:28 +0200 Subject: Provide a way of exposing private QProperties with a fake API The API reduces the amount of manual plumbing required to offer a conceptual property through the traditional setter/getter API as well as through QProperty API. Since the latter would require inlining the type and thus making it impossible to add new properties without breaking binary compatibility, this patch introduces a fake API that behaves similar but does not contain the property by value. Change-Id: Ib9bccd867f0e4e36a520e5583ba348e728284253 Reviewed-by: Fabian Kosmale --- src/corelib/kernel/qtmetamacros.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/corelib/kernel/qtmetamacros.h') diff --git a/src/corelib/kernel/qtmetamacros.h b/src/corelib/kernel/qtmetamacros.h index 2dcd6948aa..fb89722847 100644 --- a/src/corelib/kernel/qtmetamacros.h +++ b/src/corelib/kernel/qtmetamacros.h @@ -91,6 +91,34 @@ QT_BEGIN_NAMESPACE #define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x) #define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__) #define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text) +#define Q_PRIVATE_QPROPERTY(accessor, type, name, setter, ...) \ + struct _qt_property_api_##name { \ + type value() const; \ + type operator()() const { return value(); } \ + void setValue(type &&); \ + void setValue(const type &); \ + void operator=(const type &v) { setValue(v); } \ + void operator=(type &&v) { setValue(std::move(v)); } \ + QPropertyBinding setBinding(const QPropertyBinding &); \ + QPropertyBinding setBinding(QPropertyBinding &&); \ + QPropertyBinding operator=(const QPropertyBinding &b) { return setBinding(b); } \ + QPropertyBinding operator=(QPropertyBinding &&b) { return setBinding(std::move(b)); } \ + bool setBinding(const QUntypedPropertyBinding &); \ + template \ + QPropertyBinding setBinding(Functor f, \ + const QPropertyBindingSourceLocation &location = QT_PROPERTY_DEFAULT_BINDING_LOCATION) \ + { \ + return setBinding(Qt::makePropertyBinding(f, location)); \ + } \ + bool hasBinding() const; \ + QPropertyBinding binding() const; \ + QPropertyBinding takeBinding(); \ + }; \ + void setter(const type &value); +#define Q_PRIVATE_QPROPERTIES_BEGIN union { +#define Q_PRIVATE_QPROPERTY_IMPL(name) \ + _qt_property_api_##name name; +#define Q_PRIVATE_QPROPERTIES_END }; #ifndef Q_REVISION # define Q_REVISION(...) #endif @@ -211,6 +239,10 @@ private: \ #define Q_INTERFACES(x) Q_INTERFACES(x) #define Q_PROPERTY(text) Q_PROPERTY(text) #define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text) +#define Q_PRIVATE_QPROPERTY(accessor, type, name, setter, ...) Q_PRIVATE_QPROPERTY(accessor, type, name, setter, __VA_ARGS__) +#define Q_PRIVATE_QPROPERTIES_BEGIN +#define Q_PRIVATE_QPROPERTY_IMPL(name) +#define Q_PRIVATE_QPROPERTIES_END #define Q_REVISION(...) Q_REVISION(__VA_ARGS__) #define Q_OVERRIDE(text) Q_OVERRIDE(text) #define Q_ENUMS(x) Q_ENUMS(x) -- cgit v1.2.3