- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Directories
- Examples

- File List
- File Members

# qobjectdefs.h

Go to the documentation of this file.

    00001 /****************************************************************************
    00002 **
    00003 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    00004 ** All rights reserved.
    00005 ** Contact: Nokia Corporation (qt-info@nokia.com)
    00006 **
    00007 ** This file is part of the QtCore module of the Qt Toolkit.
    00008 **
    00009 ** $QT_BEGIN_LICENSE:LGPL$
    00010 ** Commercial Usage
    00011 ** Licensees holding valid Qt Commercial licenses may use this file in
    00012 ** accordance with the Qt Commercial License Agreement provided with the
    00013 ** Software or, alternatively, in accordance with the terms contained in
    00014 ** a written agreement between you and Nokia.
    00015 **
    00016 ** GNU Lesser General Public License Usage
    00017 ** Alternatively, this file may be used under the terms of the GNU Lesser
    00018 ** General Public License version 2.1 as published by the Free Software
    00019 ** Foundation and appearing in the file LICENSE.LGPL included in the
    00020 ** packaging of this file.  Please review the following information to
    00021 ** ensure the GNU Lesser General Public License version 2.1 requirements
    00022 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    00023 **
    00024 ** In addition, as a special exception, Nokia gives you certain additional
    00025 ** rights.  These rights are described in the Nokia Qt LGPL Exception
    00026 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this module.
    00027 **
    00028 ** GNU General Public License Usage
    00029 ** Alternatively, this file may be used under the terms of the GNU
    00030 ** General Public License version 3.0 as published by the Free Software
    00031 ** Foundation and appearing in the file LICENSE.GPL included in the
    00032 ** packaging of this file.  Please review the following information to
    00033 ** ensure the GNU General Public License version 3.0 requirements will be
    00034 ** met: http://www.gnu.org/copyleft/gpl.html.
    00035 **
    00036 ** If you have questions regarding the use of this file, please contact
    00037 ** Nokia at qt-info@nokia.com.
    00038 ** $QT_END_LICENSE$
    00039 **
    00040 ****************************************************************************/
    00041
    00042 #ifndef QOBJECTDEFS_H
    00043 #define QOBJECTDEFS_H
    00044
    00045 #include <QtCore/qnamespace.h>
    00046
    00047 QT_BEGIN_HEADER
    00048
    00049 QT_BEGIN_NAMESPACE
    00050
    00051 QT_MODULE(Core)
    00052
    00053 class QByteArray;
    00054
    00055 class QString;
    00056
    00057 #ifndef Q_MOC_OUTPUT_REVISION
    00058 #define Q_MOC_OUTPUT_REVISION 62
    00059 #endif
    00060
    00061 // The following macros are our "extensions" to C++
    00062 // They are used, strictly speaking, only by the moc.
    00063
    00064 #ifndef Q_MOC_RUN
    00065 # if defined(QT_NO_KEYWORDS)
    00066 #  define QT_NO_EMIT
    00067 # else
    00068 #   define slots
    00069 #   define signals protected
    00070 # endif
    00071 # define Q_SLOTS
    00072 # define Q_SIGNALS protected
    00073 # define Q_PRIVATE_SLOT(d, signature)
    00074 # define Q_EMIT
    00075 #ifndef QT_NO_EMIT
    00076 # define emit
    00077 #endif
    00078 #define Q_CLASSINFO(name, value)
    00079 #define Q_INTERFACES(x)
    00080 #define Q_PROPERTY(text)
    00081 #define Q_PRIVATE_PROPERTY(d, text)
    00082 #define Q_OVERRIDE(text)
    00083 #define Q_ENUMS(x)
    00084 #define Q_FLAGS(x)
    00085 #ifdef QT3_SUPPORT
    00086 # define Q_SETS(x)
    00087 #endif
    00088 #define Q_SCRIPTABLE
    00089 #define Q_INVOKABLE
    00090 #define Q_SIGNAL
    00091 #define Q_SLOT
    00092
    00093 #ifndef QT_NO_TRANSLATION
    00094 # ifndef QT_NO_TEXTCODEC
    00095 // full set of tr functions
    00096 // ### Qt 5: merge overloads
    00097 #  define QT_TR_FUNCTIONS \
    00098     static inline QString tr(const char *s, const char *c = 0) \
    00099         { return staticMetaObject.tr(s, c); } \
    00100     static inline QString trUtf8(const char *s, const char *c = 0) \
    00101         { return staticMetaObject.trUtf8(s, c); } \
    00102     static inline QString tr(const char *s, const char *c, int n) \
    00103         { return staticMetaObject.tr(s, c, n); } \
    00104     static inline QString trUtf8(const char *s, const char *c, int n) \
    00105         { return staticMetaObject.trUtf8(s, c, n); }
    00106 # else
    00107 // no QTextCodec, no utf8
    00108 // ### Qt 5: merge overloads
    00109 #  define QT_TR_FUNCTIONS \
    00110     static inline QString tr(const char *s, const char *c = 0) \
    00111         { return staticMetaObject.tr(s, c); } \
    00112     static inline QString tr(const char *s, const char *c, int n) \
    00113         { return staticMetaObject.tr(s, c, n); }
    00114 # endif
    00115 #else
    00116 // inherit the ones from QObject
    00117 # define QT_TR_FUNCTIONS
    00118 #endif
    00119
    00120 #if defined(QT_NO_MEMBER_TEMPLATES) || defined(QT_NO_QOBJECT_CHECK)
    00121 /* tmake ignore Q_OBJECT */
    00122 #define Q_OBJECT_CHECK
    00123 #else
    00124
    00125 /* This is a compile time check that ensures that any class cast with qobject_cast
    00126    actually contains a Q_OBJECT macro. Note: qobject_cast will fail if a QObject
    00127    subclass doesn't contain Q_OBJECT.
    00128
    00129    In qt_check_for_QOBJECT_macro, we call a dummy templated function with two
    00130    parameters, the first being "this" and the other the target of the qobject
    00131    cast. If the types are not identical, we know that a Q_OBJECT macro is missing.
    00132
    00133    If you get a compiler error here, make sure that the class you are casting
    00134    to contains a Q_OBJECT macro.
    00135 */
    00136
    00137 /* tmake ignore Q_OBJECT */
    00138 #define Q_OBJECT_CHECK \
    00139     template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const \
    00140     { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i; }
    00141
    00142 template <typename T>
    00143 inline int qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }
    00144
    00145 template <typename T1, typename T2>
    00146 inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
    00147 #endif // QT_NO_MEMBER_TEMPLATES
    00148
    00149 #ifdef Q_NO_DATA_RELOCATION
    00150 #define Q_OBJECT_GETSTATICMETAOBJECT static const QMetaObject &getStaticMetaObject();
    00151 #else
    00152 #define Q_OBJECT_GETSTATICMETAOBJECT
    00153 #endif
    00154
    00155 /* tmake ignore Q_OBJECT */
    00156 #define Q_OBJECT \
    00157 public: \
    00158     Q_OBJECT_CHECK \
    00159     static const QMetaObject staticMetaObject; \
    00160     Q_OBJECT_GETSTATICMETAOBJECT \
    00161     virtual const QMetaObject *metaObject() const; \
    00162     virtual void *qt_metacast(const char *); \
    00163     QT_TR_FUNCTIONS \
    00164     virtual int qt_metacall(QMetaObject::Call, int, void **); \
    00165 private:
    00166 /* tmake ignore Q_OBJECT */
    00167 #define Q_OBJECT_FAKE Q_OBJECT
    00168 /* tmake ignore Q_GADGET */
    00169 #define Q_GADGET \
    00170 public: \
    00171     static const QMetaObject staticMetaObject; \
    00172     Q_OBJECT_GETSTATICMETAOBJECT \
    00173 private:
    00174 #else // Q_MOC_RUN
    00175 #define slots slots
    00176 #define signals signals
    00177 #define Q_SLOTS Q_SLOTS
    00178 #define Q_SIGNALS Q_SIGNALS
    00179 #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
    00180 #define Q_INTERFACES(x) Q_INTERFACES(x)
    00181 #define Q_PROPERTY(text) Q_PROPERTY(text)
    00182 #define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
    00183 #define Q_OVERRIDE(text) Q_OVERRIDE(text)
    00184 #define Q_ENUMS(x) Q_ENUMS(x)
    00185 #define Q_FLAGS(x) Q_FLAGS(x)
    00186 #ifdef QT3_SUPPORT
    00187 # define Q_SETS(x) Q_SETS(x)
    00188 #endif
    00189  /* tmake ignore Q_OBJECT */
    00190 #define Q_OBJECT Q_OBJECT
    00191  /* tmake ignore Q_OBJECT */
    00192 #define Q_OBJECT_FAKE Q_OBJECT_FAKE
    00193  /* tmake ignore Q_GADGET */
    00194 #define Q_GADGET Q_GADGET
    00195 #define Q_SCRIPTABLE Q_SCRIPTABLE
    00196 #define Q_INVOKABLE Q_INVOKABLE
    00197 #define Q_SIGNAL Q_SIGNAL
    00198 #define Q_SLOT Q_SLOT
    00199 #endif //Q_MOC_RUN
    00200
    00201 // macro for onaming members
    00202 #ifdef METHOD
    00203 #undef METHOD
    00204 #endif
    00205 #ifdef SLOT
    00206 #undef SLOT
    00207 #endif
    00208 #ifdef SIGNAL
    00209 #undef SIGNAL
    00210 #endif
    00211
    00212 Q_CORE_EXPORT const char *qFlagLocation(const char *method);
    00213
    00214 #define QTOSTRING_HELPER(s) #s
    00215 #define QTOSTRING(s) QTOSTRING_HELPER(s)
    00216 #ifndef QT_NO_DEBUG
    00217 # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__)
    00218 # define METHOD(a)   qFlagLocation("0"#a QLOCATION)
    00219 # define SLOT(a)     qFlagLocation("1"#a QLOCATION)
    00220 # define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
    00221 #else
    00222 # define METHOD(a)   "0"#a
    00223 # define SLOT(a)     "1"#a
    00224 # define SIGNAL(a)   "2"#a
    00225 #endif
    00226
    00227 #ifdef QT3_SUPPORT
    00228 #define METHOD_CODE   0                        // member type codes
    00229 #define SLOT_CODE     1
    00230 #define SIGNAL_CODE   2
    00231 #endif
    00232
    00233 #define QMETHOD_CODE  0                        // member type codes
    00234 #define QSLOT_CODE    1
    00235 #define QSIGNAL_CODE  2
    00236
    00237 #define Q_ARG(type, data) QArgument<type >(#type, data)
    00238 #define Q_RETURN_ARG(type, data) QReturnArgument<type >(#type, data)
    00239
    00240 class QObject;
    00241 class QMetaMethod;
    00242 class QMetaEnum;
    00243 class QMetaProperty;
    00244 class QMetaClassInfo;
    00245
    00246
    00247 class Q_CORE_EXPORT QGenericArgument
    00248 {
    00249 public:
    00250     inline QGenericArgument(const char *aName = 0, const void *aData = 0)
    00251         : _data(aData), _name(aName) {}
    00252     inline void *data() const { return const_cast<void *>(_data); }
    00253     inline const char *name() const { return _name; }
    00254
    00255 private:
    00256     const void *_data;
    00257     const char *_name;
    00258 };
    00259
    00260 class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument
    00261 {
    00262 public:
    00263     inline QGenericReturnArgument(const char *aName = 0, void *aData = 0)
    00264         : QGenericArgument(aName, aData)
    00265         {}
    00266 };
    00267
    00268 template <class T>
    00269 class QArgument: public QGenericArgument
    00270 {
    00271 public:
    00272     inline QArgument(const char *aName, const T &aData)
    00273         : QGenericArgument(aName, static_cast<const void *>(&aData))
    00274         {}
    00275 };
    00276 template <class T>
    00277 class QArgument<T &>: public QGenericArgument
    00278 {
    00279 public:
    00280     inline QArgument(const char *aName, T &aData)
    00281         : QGenericArgument(aName, static_cast<const void *>(&aData))
    00282         {}
    00283 };
    00284
    00285
    00286 template <typename T>
    00287 class QReturnArgument: public QGenericReturnArgument
    00288 {
    00289 public:
    00290     inline QReturnArgument(const char *aName, T &aData)
    00291         : QGenericReturnArgument(aName, static_cast<void *>(&aData))
    00292         {}
    00293 };
    00294
    00295 struct Q_CORE_EXPORT QMetaObject
    00296 {
    00297     const char *className() const;
    00298     const QMetaObject *superClass() const;
    00299
    00300     QObject *cast(QObject *obj) const;
    00301
    00302 #ifndef QT_NO_TRANSLATION
    00303     // ### Qt 4: Merge overloads
    00304     QString tr(const char *s, const char *c) const;
    00305     QString trUtf8(const char *s, const char *c) const;
    00306     QString tr(const char *s, const char *c, int n) const;
    00307     QString trUtf8(const char *s, const char *c, int n) const;
    00308 #endif // QT_NO_TRANSLATION
    00309
    00310     int methodOffset() const;
    00311     int enumeratorOffset() const;
    00312     int propertyOffset() const;
    00313     int classInfoOffset() const;
    00314
    00315     int constructorCount() const;
    00316     int methodCount() const;
    00317     int enumeratorCount() const;
    00318     int propertyCount() const;
    00319     int classInfoCount() const;
    00320
    00321     int indexOfConstructor(const char *constructor) const;
    00322     int indexOfMethod(const char *method) const;
    00323     int indexOfSignal(const char *signal) const;
    00324     int indexOfSlot(const char *slot) const;
    00325     int indexOfEnumerator(const char *name) const;
    00326     int indexOfProperty(const char *name) const;
    00327     int indexOfClassInfo(const char *name) const;
    00328
    00329     QMetaMethod constructor(int index) const;
    00330     QMetaMethod method(int index) const;
    00331     QMetaEnum enumerator(int index) const;
    00332     QMetaProperty property(int index) const;
    00333     QMetaClassInfo classInfo(int index) const;
    00334     QMetaProperty userProperty() const;
    00335
    00336     static bool checkConnectArgs(const char *signal, const char *method);
    00337     static QByteArray normalizedSignature(const char *method);
    00338     static QByteArray normalizedType(const char *type);
    00339
    00340     // internal index-based connect
    00341     static bool connect(const QObject *sender, int signal_index,
    00342                         const QObject *receiver, int method_index,
    00343                         int type = 0, int *types = 0);
    00344     // internal index-based disconnect
    00345     static bool disconnect(const QObject *sender, int signal_index,
    00346                            const QObject *receiver, int method_index);
    00347     static bool disconnectOne(const QObject *sender, int signal_index,
    00348                               const QObject *receiver, int method_index);
    00349     // internal slot-name based connect
    00350     static void connectSlotsByName(QObject *o);
    00351
    00352     // internal index-based signal activation
    00353     static void activate(QObject *sender, int signal_index, void **argv);  //obsolete
    00354     static void activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv); //obsolete
    00355     static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
    00356     static void activate(QObject *sender, const QMetaObject *, int from_local_signal_index, int to_local_signal_index, void **argv); //obsolete
    00357
    00358     // internal guarded pointers
    00359     static void addGuard(QObject **ptr);
    00360     static void removeGuard(QObject **ptr);
    00361     static void changeGuard(QObject **ptr, QObject *o);
    00362
    00363     static bool invokeMethod(QObject *obj, const char *member,
    00364                              Qt::ConnectionType,
    00365                              QGenericReturnArgument ret,
    00366                              QGenericArgument val0 = QGenericArgument(0),
    00367                              QGenericArgument val1 = QGenericArgument(),
    00368                              QGenericArgument val2 = QGenericArgument(),
    00369                              QGenericArgument val3 = QGenericArgument(),
    00370                              QGenericArgument val4 = QGenericArgument(),
    00371                              QGenericArgument val5 = QGenericArgument(),
    00372                              QGenericArgument val6 = QGenericArgument(),
    00373                              QGenericArgument val7 = QGenericArgument(),
    00374                              QGenericArgument val8 = QGenericArgument(),
    00375                              QGenericArgument val9 = QGenericArgument());
    00376
    00377     static inline bool invokeMethod(QObject *obj, const char *member,
    00378                              QGenericReturnArgument ret,
    00379                              QGenericArgument val0 = QGenericArgument(0),
    00380                              QGenericArgument val1 = QGenericArgument(),
    00381                              QGenericArgument val2 = QGenericArgument(),
    00382                              QGenericArgument val3 = QGenericArgument(),
    00383                              QGenericArgument val4 = QGenericArgument(),
    00384                              QGenericArgument val5 = QGenericArgument(),
    00385                              QGenericArgument val6 = QGenericArgument(),
    00386                              QGenericArgument val7 = QGenericArgument(),
    00387                              QGenericArgument val8 = QGenericArgument(),
    00388                              QGenericArgument val9 = QGenericArgument())
    00389     {
    00390         return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,
    00391                 val4, val5, val6, val7, val8, val9);
    00392     }
    00393
    00394     static inline bool invokeMethod(QObject *obj, const char *member,
    00395                              Qt::ConnectionType type,
    00396                              QGenericArgument val0 = QGenericArgument(0),
    00397                              QGenericArgument val1 = QGenericArgument(),
    00398                              QGenericArgument val2 = QGenericArgument(),
    00399                              QGenericArgument val3 = QGenericArgument(),
    00400                              QGenericArgument val4 = QGenericArgument(),
    00401                              QGenericArgument val5 = QGenericArgument(),
    00402                              QGenericArgument val6 = QGenericArgument(),
    00403                              QGenericArgument val7 = QGenericArgument(),
    00404                              QGenericArgument val8 = QGenericArgument(),
    00405                              QGenericArgument val9 = QGenericArgument())
    00406     {
    00407         return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2,
    00408                                  val3, val4, val5, val6, val7, val8, val9);
    00409     }
    00410
    00411     static inline bool invokeMethod(QObject *obj, const char *member,
    00412                              QGenericArgument val0 = QGenericArgument(0),
    00413                              QGenericArgument val1 = QGenericArgument(),
    00414                              QGenericArgument val2 = QGenericArgument(),
    00415                              QGenericArgument val3 = QGenericArgument(),
    00416                              QGenericArgument val4 = QGenericArgument(),
    00417                              QGenericArgument val5 = QGenericArgument(),
    00418                              QGenericArgument val6 = QGenericArgument(),
    00419                              QGenericArgument val7 = QGenericArgument(),
    00420                              QGenericArgument val8 = QGenericArgument(),
    00421                              QGenericArgument val9 = QGenericArgument())
    00422     {
    00423         return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,
    00424                 val1, val2, val3, val4, val5, val6, val7, val8, val9);
    00425     }
    00426
    00427     QObject *newInstance(QGenericArgument val0 = QGenericArgument(0),
    00428                          QGenericArgument val1 = QGenericArgument(),
    00429                          QGenericArgument val2 = QGenericArgument(),
    00430                          QGenericArgument val3 = QGenericArgument(),
    00431                          QGenericArgument val4 = QGenericArgument(),
    00432                          QGenericArgument val5 = QGenericArgument(),
    00433                          QGenericArgument val6 = QGenericArgument(),
    00434                          QGenericArgument val7 = QGenericArgument(),
    00435                          QGenericArgument val8 = QGenericArgument(),
    00436                          QGenericArgument val9 = QGenericArgument()) const;
    00437
    00438     enum Call {
    00439         InvokeMetaMethod,
    00440         ReadProperty,
    00441         WriteProperty,
    00442         ResetProperty,
    00443         QueryPropertyDesignable,
    00444         QueryPropertyScriptable,
    00445         QueryPropertyStored,
    00446         QueryPropertyEditable,
    00447         QueryPropertyUser,
    00448         CreateInstance
    00449     };
    00450
    00451     int static_metacall(Call, int, void **) const;
    00452     static int metacall(QObject *, Call, int, void **);
    00453
    00454 #ifdef QT3_SUPPORT
    00455     QT3_SUPPORT const char *superClassName() const;
    00456 #endif
    00457
    00458     struct { // private data
    00459         const QMetaObject *superdata;
    00460         const char *stringdata;
    00461         const uint *data;
    00462         const void *extradata;
    00463     } d;
    00464
    00465 };
    00466
    00467 typedef const QMetaObject& (*QMetaObjectAccessor)();
    00468
    00469 struct QMetaObjectExtraData
    00470 {
    00471 #ifdef Q_NO_DATA_RELOCATION
    00472     const QMetaObjectAccessor *objects;
    00473 #else
    00474     const QMetaObject **objects;
    00475 #endif
    00476     int (*static_metacall)(QMetaObject::Call, int, void **);
    00477 };
    00478
    00479 inline const char *QMetaObject::className() const
    00480 { return d.stringdata; }
    00481
    00482 inline const QMetaObject *QMetaObject::superClass() const
    00483 { return d.superdata; }
    00484
    00485 #ifdef QT3_SUPPORT
    00486 inline const char *QMetaObject::superClassName() const
    00487 { return d.superdata ? d.superdata->className() : 0; }
    00488 #endif
    00489
    00490 QT_END_NAMESPACE
    00491
    00492 QT_END_HEADER
    00493
    00494 #endif // QOBJECTDEFS_H