diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2019-12-04 19:36:33 +0100 |
---|---|---|
committer | Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> | 2019-12-06 20:29:15 +0000 |
commit | cedf0207d1ebd931fe155ca04abbf3cb0702854a (patch) | |
tree | 18e05bd7f3ed9b448b256c1c4337ced4b4749465 /src/corelib/kernel | |
parent | b0498b1864829a314b70c4204bb47529ab3654b2 (diff) |
Use Q_NAMESPACE for the Qt namespace, and remove the old moc hack to support it
Since I can't #include qobjectdefs from qnamespace because of circular dependency,
move the Qt macro in the qtmetamacros.h header.
Deprecate QObject::staticQtMetaObject since now one can just use Qt::staticMetaObject
Change-Id: I11982aa17c2afa2067486b113f8052672f3695eb
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.h | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qobjectdefs.h | 185 | ||||
-rw-r--r-- | src/corelib/kernel/qtmetamacros.h | 233 |
4 files changed, 235 insertions, 191 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index b1e1bb8b4a..4484dfdce9 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1163,7 +1163,7 @@ QMetaProperty QMetaObject::property(int index) const const QMetaObject *scope = 0; if (qstrcmp(scope_name, "Qt") == 0) - scope = &QObject::staticQtMetaObject; + scope = &Qt::staticMetaObject; else scope = QMetaObject_findMetaObject(this, scope_name); if (scope) diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index 296552c2f2..ca5275a3ac 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -434,9 +434,6 @@ protected: protected: QScopedPointer<QObjectData> d_ptr; - static const QMetaObject staticQtMetaObject; - friend inline const QMetaObject *qt_getQtMetaObject() noexcept; - friend struct QMetaObject; friend struct QMetaObjectPrivate; friend class QMetaCallEvent; @@ -467,9 +464,6 @@ inline QMetaObject::Connection QObject::connect(const QObject *asender, const ch const char *amember, Qt::ConnectionType atype) const { return connect(asender, asignal, this, amember, atype); } -inline const QMetaObject *qt_getQtMetaObject() noexcept -{ return &QObject::staticQtMetaObject; } - #if QT_DEPRECATED_SINCE(5, 0) template<typename T> inline QT_DEPRECATED T qFindChild(const QObject *o, const QString &name = QString()) diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index 9f654b0318..90e3aa02d8 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -46,199 +46,16 @@ #endif #include <QtCore/qnamespace.h> - #include <QtCore/qobjectdefs_impl.h> +#include <QtCore/qtmetamacros.h> QT_BEGIN_NAMESPACE - class QByteArray; struct QArrayData; typedef QArrayData QByteArrayData; class QString; -#ifndef Q_MOC_OUTPUT_REVISION -#define Q_MOC_OUTPUT_REVISION 67 -#endif - -// The following macros can be defined by tools that understand Qt -// to have the information from the macro. -#ifndef QT_ANNOTATE_CLASS -# define QT_ANNOTATE_CLASS(type, ...) -#endif -#ifndef QT_ANNOTATE_CLASS2 -# define QT_ANNOTATE_CLASS2(type, a1, a2) -#endif -#ifndef QT_ANNOTATE_FUNCTION -# define QT_ANNOTATE_FUNCTION(x) -#endif -#ifndef QT_ANNOTATE_ACCESS_SPECIFIER -# define QT_ANNOTATE_ACCESS_SPECIFIER(x) -#endif - -// The following macros are our "extensions" to C++ -// They are used, strictly speaking, only by the moc. - -#ifndef Q_MOC_RUN -#ifndef QT_NO_META_MACROS -# if defined(QT_NO_KEYWORDS) -# define QT_NO_EMIT -# else -# ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS -# define slots Q_SLOTS -# define signals Q_SIGNALS -# endif -# endif -# define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) -# define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal) -# define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature) -# define Q_EMIT -#ifndef QT_NO_EMIT -# define emit -#endif -#ifndef Q_CLASSINFO -# define Q_CLASSINFO(name, value) -#endif -#define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x) -#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) -#ifndef Q_REVISION -# define Q_REVISION(v) -#endif -#define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text) -#define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text) -#define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x) -#define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x) -#define Q_ENUM_IMPL(ENUM) \ - friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ - friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } -#define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x) -#define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x) -#define Q_ENUM_NS_IMPL(ENUM) \ - inline Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ - inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } -#define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x) -#define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x) -#define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable) -#define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable) -#define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal) -#define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot) -#endif // QT_NO_META_MACROS - -#ifndef QT_NO_TRANSLATION -// full set of tr functions -# define QT_TR_FUNCTIONS \ - static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \ - { return staticMetaObject.tr(s, c, n); } \ - QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \ - { return staticMetaObject.tr(s, c, n); } -#else -// inherit the ones from QObject -# define QT_TR_FUNCTIONS -#endif - -#ifdef Q_CLANG_QDOC -#define QT_TR_FUNCTIONS -#endif - -// ### Qt6: remove -#define Q_OBJECT_CHECK /* empty, unused since Qt 5.2 */ - -#if defined(Q_CC_INTEL) -// Cannot redefine the visibility of a method in an exported class -# define Q_DECL_HIDDEN_STATIC_METACALL -#else -# define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN -#endif - -#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306 -# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") -#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501 -# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override") -#else -# define Q_OBJECT_NO_OVERRIDE_WARNING -#endif - -#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600 -# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes") -#else -# define Q_OBJECT_NO_ATTRIBUTES_WARNING -#endif - -/* qmake ignore Q_OBJECT */ -#define Q_OBJECT \ -public: \ - QT_WARNING_PUSH \ - Q_OBJECT_NO_OVERRIDE_WARNING \ - static const QMetaObject staticMetaObject; \ - virtual const QMetaObject *metaObject() const; \ - virtual void *qt_metacast(const char *); \ - virtual int qt_metacall(QMetaObject::Call, int, void **); \ - QT_TR_FUNCTIONS \ -private: \ - Q_OBJECT_NO_ATTRIBUTES_WARNING \ - Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ - QT_WARNING_POP \ - struct QPrivateSignal {}; \ - QT_ANNOTATE_CLASS(qt_qobject, "") - -/* qmake ignore Q_OBJECT */ -#define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "") - -#ifndef QT_NO_META_MACROS -/* qmake ignore Q_GADGET */ -#define Q_GADGET \ -public: \ - static const QMetaObject staticMetaObject; \ - void qt_check_for_QGADGET_macro(); \ - typedef void QtGadgetHelper; \ -private: \ - QT_WARNING_PUSH \ - Q_OBJECT_NO_ATTRIBUTES_WARNING \ - Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ - QT_WARNING_POP \ - QT_ANNOTATE_CLASS(qt_qgadget, "") \ - /*end*/ - -/* qmake ignore Q_NAMESPACE_EXPORT */ -#define Q_NAMESPACE_EXPORT(...) \ - extern __VA_ARGS__ const QMetaObject staticMetaObject; \ - QT_ANNOTATE_CLASS(qt_qnamespace, "") \ - /*end*/ - -/* qmake ignore Q_NAMESPACE */ -#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \ - /*end*/ - -#endif // QT_NO_META_MACROS - -#else // Q_MOC_RUN -#define slots slots -#define signals signals -#define Q_SLOTS Q_SLOTS -#define Q_SIGNALS Q_SIGNALS -#define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value) -#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_REVISION(v) Q_REVISION(v) -#define Q_OVERRIDE(text) Q_OVERRIDE(text) -#define Q_ENUMS(x) Q_ENUMS(x) -#define Q_FLAGS(x) Q_FLAGS(x) -#define Q_ENUM(x) Q_ENUM(x) -#define Q_FLAGS(x) Q_FLAGS(x) - /* qmake ignore Q_OBJECT */ -#define Q_OBJECT Q_OBJECT - /* qmake ignore Q_OBJECT */ -#define Q_OBJECT_FAKE Q_OBJECT_FAKE - /* qmake ignore Q_GADGET */ -#define Q_GADGET Q_GADGET -#define Q_SCRIPTABLE Q_SCRIPTABLE -#define Q_INVOKABLE Q_INVOKABLE -#define Q_SIGNAL Q_SIGNAL -#define Q_SLOT Q_SLOT -#endif //Q_MOC_RUN #ifndef QT_NO_META_MACROS // macro for onaming members diff --git a/src/corelib/kernel/qtmetamacros.h b/src/corelib/kernel/qtmetamacros.h new file mode 100644 index 0000000000..19b6bfa358 --- /dev/null +++ b/src/corelib/kernel/qtmetamacros.h @@ -0,0 +1,233 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2019 Olivier Goffart <ogoffart@woboq.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTMETAMACROS_H +#define QTMETAMACROS_H + +#include <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#ifndef Q_MOC_OUTPUT_REVISION +#define Q_MOC_OUTPUT_REVISION 67 +#endif + +// The following macros can be defined by tools that understand Qt +// to have the information from the macro. +#ifndef QT_ANNOTATE_CLASS +# define QT_ANNOTATE_CLASS(type, ...) +#endif +#ifndef QT_ANNOTATE_CLASS2 +# define QT_ANNOTATE_CLASS2(type, a1, a2) +#endif +#ifndef QT_ANNOTATE_FUNCTION +# define QT_ANNOTATE_FUNCTION(x) +#endif +#ifndef QT_ANNOTATE_ACCESS_SPECIFIER +# define QT_ANNOTATE_ACCESS_SPECIFIER(x) +#endif + +// The following macros are our "extensions" to C++ +// They are used, strictly speaking, only by the moc. + +#ifndef Q_MOC_RUN +#ifndef QT_NO_META_MACROS +# if defined(QT_NO_KEYWORDS) +# define QT_NO_EMIT +# else +# ifndef QT_NO_SIGNALS_SLOTS_KEYWORDS +# define slots Q_SLOTS +# define signals Q_SIGNALS +# endif +# endif +# define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) +# define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal) +# define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature) +# define Q_EMIT +#ifndef QT_NO_EMIT +# define emit +#endif +#ifndef Q_CLASSINFO +# define Q_CLASSINFO(name, value) +#endif +#define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x) +#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) +#ifndef Q_REVISION +# define Q_REVISION(v) +#endif +#define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text) +#define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text) +#define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x) +#define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x) +#define Q_ENUM_IMPL(ENUM) \ + friend Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ + friend Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } +#define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x) +#define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x) +#define Q_ENUM_NS_IMPL(ENUM) \ + inline Q_DECL_CONSTEXPR const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \ + inline Q_DECL_CONSTEXPR const char *qt_getEnumName(ENUM) noexcept { return #ENUM; } +#define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x) +#define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x) +#define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable) +#define Q_INVOKABLE QT_ANNOTATE_FUNCTION(qt_invokable) +#define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal) +#define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot) +#endif // QT_NO_META_MACROS + +#ifndef QT_NO_TRANSLATION +// full set of tr functions +# define QT_TR_FUNCTIONS \ + static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \ + { return staticMetaObject.tr(s, c, n); } \ + QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \ + { return staticMetaObject.tr(s, c, n); } +#else +// inherit the ones from QObject +# define QT_TR_FUNCTIONS +#endif + +#ifdef Q_CLANG_QDOC +#define QT_TR_FUNCTIONS +#endif + +// ### Qt6: remove +#define Q_OBJECT_CHECK /* empty, unused since Qt 5.2 */ + +#if defined(Q_CC_INTEL) +// Cannot redefine the visibility of a method in an exported class +# define Q_DECL_HIDDEN_STATIC_METACALL +#else +# define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN +#endif + +#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306 +# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") +#elif defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 501 +# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_GCC("-Wsuggest-override") +#else +# define Q_OBJECT_NO_OVERRIDE_WARNING +#endif + +#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600 +# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes") +#else +# define Q_OBJECT_NO_ATTRIBUTES_WARNING +#endif + +/* qmake ignore Q_OBJECT */ +#define Q_OBJECT \ +public: \ + QT_WARNING_PUSH \ + Q_OBJECT_NO_OVERRIDE_WARNING \ + static const QMetaObject staticMetaObject; \ + virtual const QMetaObject *metaObject() const; \ + virtual void *qt_metacast(const char *); \ + virtual int qt_metacall(QMetaObject::Call, int, void **); \ + QT_TR_FUNCTIONS \ +private: \ + Q_OBJECT_NO_ATTRIBUTES_WARNING \ + Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ + QT_WARNING_POP \ + struct QPrivateSignal {}; \ + QT_ANNOTATE_CLASS(qt_qobject, "") + +/* qmake ignore Q_OBJECT */ +#define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "") + +#ifndef QT_NO_META_MACROS +/* qmake ignore Q_GADGET */ +#define Q_GADGET \ +public: \ + static const QMetaObject staticMetaObject; \ + void qt_check_for_QGADGET_macro(); \ + typedef void QtGadgetHelper; \ +private: \ + QT_WARNING_PUSH \ + Q_OBJECT_NO_ATTRIBUTES_WARNING \ + Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ + QT_WARNING_POP \ + QT_ANNOTATE_CLASS(qt_qgadget, "") \ + /*end*/ + +/* qmake ignore Q_NAMESPACE_EXPORT */ +#define Q_NAMESPACE_EXPORT(...) \ + extern __VA_ARGS__ const QMetaObject staticMetaObject; \ + QT_ANNOTATE_CLASS(qt_qnamespace, "") \ + /*end*/ + +/* qmake ignore Q_NAMESPACE */ +#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \ + /*end*/ + +#endif // QT_NO_META_MACROS + +#else // Q_MOC_RUN +#define slots slots +#define signals signals +#define Q_SLOTS Q_SLOTS +#define Q_SIGNALS Q_SIGNALS +#define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value) +#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_REVISION(v) Q_REVISION(v) +#define Q_OVERRIDE(text) Q_OVERRIDE(text) +#define Q_ENUMS(x) Q_ENUMS(x) +#define Q_FLAGS(x) Q_FLAGS(x) +#define Q_ENUM(x) Q_ENUM(x) +#define Q_FLAGS(x) Q_FLAGS(x) + /* qmake ignore Q_OBJECT */ +#define Q_OBJECT Q_OBJECT + /* qmake ignore Q_OBJECT */ +#define Q_OBJECT_FAKE Q_OBJECT_FAKE + /* qmake ignore Q_GADGET */ +#define Q_GADGET Q_GADGET +#define Q_SCRIPTABLE Q_SCRIPTABLE +#define Q_INVOKABLE Q_INVOKABLE +#define Q_SIGNAL Q_SIGNAL +#define Q_SLOT Q_SLOT +#endif //Q_MOC_RUN + +QT_END_NAMESPACE + +#endif // QTMETAMACROS_H |