qobjectdefs.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:15k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QOBJECTDEFS_H
  38. #define QOBJECTDEFS_H
  39. #include <QtCore/qnamespace.h>
  40. QT_BEGIN_HEADER
  41. QT_BEGIN_NAMESPACE
  42. QT_MODULE(Core)
  43. class QString;
  44. class QByteArray;
  45. #ifndef Q_MOC_OUTPUT_REVISION
  46. #define Q_MOC_OUTPUT_REVISION 59
  47. #endif
  48. // The following macros are our "extensions" to C++
  49. // They are used, strictly speaking, only by the moc.
  50. #ifndef Q_MOC_RUN
  51. # if defined(QT_NO_KEYWORDS)
  52. #  define QT_NO_EMIT
  53. # else
  54. #   define slots
  55. #   define signals protected
  56. # endif
  57. # define Q_SLOTS
  58. # define Q_SIGNALS protected
  59. # define Q_PRIVATE_SLOT(d, signature)
  60. # define Q_EMIT
  61. #ifndef QT_NO_EMIT
  62. # define emit
  63. #endif
  64. #define Q_CLASSINFO(name, value)
  65. #define Q_INTERFACES(x)
  66. #define Q_PROPERTY(text)
  67. #define Q_OVERRIDE(text)
  68. #define Q_ENUMS(x)
  69. #define Q_FLAGS(x)
  70. #ifdef QT3_SUPPORT
  71. # define Q_SETS(x)
  72. #endif
  73. #define Q_SCRIPTABLE
  74. #define Q_INVOKABLE
  75. #ifndef QT_NO_TRANSLATION
  76. # ifndef QT_NO_TEXTCODEC
  77. // full set of tr functions
  78. // ### Qt 5: merge overloads
  79. #  define QT_TR_FUNCTIONS 
  80.     static inline QString tr(const char *s, const char *c = 0) 
  81.         { return staticMetaObject.tr(s, c); } 
  82.     static inline QString trUtf8(const char *s, const char *c = 0) 
  83.         { return staticMetaObject.trUtf8(s, c); } 
  84.     static inline QString tr(const char *s, const char *c, int n) 
  85.         { return staticMetaObject.tr(s, c, n); } 
  86.     static inline QString trUtf8(const char *s, const char *c, int n) 
  87.         { return staticMetaObject.trUtf8(s, c, n); }
  88. # else
  89. // no QTextCodec, no utf8
  90. // ### Qt 5: merge overloads
  91. #  define QT_TR_FUNCTIONS 
  92.     static inline QString tr(const char *s, const char *c = 0) 
  93.         { return staticMetaObject.tr(s, c); } 
  94.     static inline QString tr(const char *s, const char *c, int n) 
  95.         { return staticMetaObject.tr(s, c, n); }
  96. # endif
  97. #else
  98. // inherit the ones from QObject
  99. # define QT_TR_FUNCTIONS
  100. #endif
  101. #if defined(QT_NO_MEMBER_TEMPLATES) || defined(QT_NO_QOBJECT_CHECK)
  102. /* tmake ignore Q_OBJECT */
  103. #define Q_OBJECT_CHECK
  104. #else
  105. /* This is a compile time check that ensures that any class cast with qobject_cast
  106.    actually contains a Q_OBJECT macro. Note: qobject_cast will fail if a QObject
  107.    subclass doesn't contain Q_OBJECT.
  108.    In qt_check_for_QOBJECT_macro, we call a dummy templated function with two
  109.    parameters, the first being "this" and the other the target of the qobject
  110.    cast. If the types are not identical, we know that a Q_OBJECT macro is missing.
  111.    If you get a compiler error here, make sure that the class you are casting
  112.    to contains a Q_OBJECT macro.
  113. */
  114. /* tmake ignore Q_OBJECT */
  115. #define Q_OBJECT_CHECK 
  116.     template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const 
  117.     { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i; }
  118. template <typename T>
  119. inline int qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }
  120. template <typename T1, typename T2>
  121. inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
  122. #endif // QT_NO_MEMBER_TEMPLATES
  123. /* tmake ignore Q_OBJECT */
  124. #define Q_OBJECT 
  125. public: 
  126.     Q_OBJECT_CHECK 
  127.     static const QMetaObject staticMetaObject; 
  128.     virtual const QMetaObject *metaObject() const; 
  129.     virtual void *qt_metacast(const char *); 
  130.     QT_TR_FUNCTIONS 
  131.     virtual int qt_metacall(QMetaObject::Call, int, void **); 
  132. private:
  133. /* tmake ignore Q_OBJECT */
  134. #define Q_OBJECT_FAKE Q_OBJECT
  135. /* tmake ignore Q_GADGET */
  136. #define Q_GADGET 
  137. public: 
  138.     static const QMetaObject staticMetaObject; 
  139. private:
  140. #else // Q_MOC_RUN
  141. #define slots slots
  142. #define signals signals
  143. #define Q_SLOTS Q_SLOTS
  144. #define Q_SIGNALS Q_SIGNALS
  145. #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
  146. #define Q_INTERFACES(x) Q_INTERFACES(x)
  147. #define Q_PROPERTY(text) Q_PROPERTY(text)
  148. #define Q_OVERRIDE(text) Q_OVERRIDE(text)
  149. #define Q_ENUMS(x) Q_ENUMS(x)
  150. #define Q_FLAGS(x) Q_FLAGS(x)
  151. #ifdef QT3_SUPPORT
  152. # define Q_SETS(x) Q_SETS(x)
  153. #endif
  154.  /* tmake ignore Q_OBJECT */
  155. #define Q_OBJECT Q_OBJECT
  156.  /* tmake ignore Q_OBJECT */
  157. #define Q_OBJECT_FAKE Q_OBJECT_FAKE
  158.  /* tmake ignore Q_GADGET */
  159. #define Q_GADGET Q_GADGET
  160. #define Q_SCRIPTABLE Q_SCRIPTABLE
  161. #define Q_INVOKABLE Q_INVOKABLE
  162. #endif //Q_MOC_RUN
  163. // macro for onaming members
  164. #ifdef METHOD
  165. #undef METHOD
  166. #endif
  167. #ifdef SLOT
  168. #undef SLOT
  169. #endif
  170. #ifdef SIGNAL
  171. #undef SIGNAL
  172. #endif
  173. #define METHOD(a)        "0"#a
  174. #define SLOT(a)                "1"#a
  175. #define SIGNAL(a)        "2"#a
  176. #ifdef QT3_SUPPORT
  177. #define METHOD_CODE        0                        // member type codes
  178. #define SLOT_CODE        1
  179. #define SIGNAL_CODE        2
  180. #endif
  181. #define QMETHOD_CODE        0                        // member type codes
  182. #define QSLOT_CODE        1
  183. #define QSIGNAL_CODE        2
  184. #define Q_ARG(type, data) QArgument<type >(#type, data)
  185. #define Q_RETURN_ARG(type, data) QReturnArgument<type >(#type, data)
  186. class QObject;
  187. class QMetaMethod;
  188. class QMetaEnum;
  189. class QMetaProperty;
  190. class QMetaClassInfo;
  191. class Q_CORE_EXPORT QGenericArgument
  192. {
  193. public:
  194.     inline QGenericArgument(const char *aName = 0, const void *aData = 0)
  195.         : _data(aData), _name(aName) {}
  196.     inline void *data() const { return const_cast<void *>(_data); }
  197.     inline const char *name() const { return _name; }
  198. private:
  199.     const void *_data;
  200.     const char *_name;
  201. };
  202. class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument
  203. {
  204. public:
  205.     inline QGenericReturnArgument(const char *aName = 0, void *aData = 0)
  206.         : QGenericArgument(aName, aData)
  207.         {}
  208. };
  209. template <class T>
  210. class QArgument: public QGenericArgument
  211. {
  212. public:
  213.     inline QArgument(const char *aName, const T &aData)
  214.         : QGenericArgument(aName, static_cast<const void *>(&aData))
  215.         {}
  216. };
  217. template <typename T>
  218. class QReturnArgument: public QGenericReturnArgument
  219. {
  220. public:
  221.     inline QReturnArgument(const char *aName, T &aData)
  222.         : QGenericReturnArgument(aName, static_cast<void *>(&aData))
  223.         {}
  224. };
  225. struct Q_CORE_EXPORT QMetaObject
  226. {
  227.     const char *className() const;
  228.     const QMetaObject *superClass() const;
  229.     QObject *cast(QObject *obj) const;
  230. #ifndef QT_NO_TRANSLATION
  231.     // ### Qt 4: Merge overloads
  232.     QString tr(const char *s, const char *c) const;
  233.     QString trUtf8(const char *s, const char *c) const;
  234.     QString tr(const char *s, const char *c, int n) const;
  235.     QString trUtf8(const char *s, const char *c, int n) const;
  236. #endif // QT_NO_TRANSLATION
  237.     int methodOffset() const;
  238.     int enumeratorOffset() const;
  239.     int propertyOffset() const;
  240.     int classInfoOffset() const;
  241.     int methodCount() const;
  242.     int enumeratorCount() const;
  243.     int propertyCount() const;
  244.     int classInfoCount() const;
  245.     int indexOfMethod(const char *method) const;
  246.     int indexOfSignal(const char *signal) const;
  247.     int indexOfSlot(const char *slot) const;
  248.     int indexOfEnumerator(const char *name) const;
  249.     int indexOfProperty(const char *name) const;
  250.     int indexOfClassInfo(const char *name) const;
  251.     QMetaMethod method(int index) const;
  252.     QMetaEnum enumerator(int index) const;
  253.     QMetaProperty property(int index) const;
  254.     QMetaClassInfo classInfo(int index) const;
  255.     QMetaProperty userProperty() const;
  256.     static bool checkConnectArgs(const char *signal, const char *method);
  257.     static QByteArray normalizedSignature(const char *method);
  258.     static QByteArray normalizedType(const char *type);
  259.     // internal index-based connect
  260.     static bool connect(const QObject *sender, int signal_index,
  261.                         const QObject *receiver, int method_index,
  262.                         int type = 0, int *types = 0);
  263.     // internal index-based disconnect
  264.     static bool disconnect(const QObject *sender, int signal_index,
  265.                            const QObject *receiver, int method_index);
  266.     // internal slot-name based connect
  267.     static void connectSlotsByName(QObject *o);
  268.     // internal index-based signal activation
  269.     static void activate(QObject *sender, int signal_index, void **argv);
  270.     static void activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv);
  271.     static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
  272.     static void activate(QObject *sender, const QMetaObject *, int from_local_signal_index, int to_local_signal_index, void **argv);
  273.     // internal guarded pointers
  274.     static void addGuard(QObject **ptr);
  275.     static void removeGuard(QObject **ptr);
  276.     static void changeGuard(QObject **ptr, QObject *o);
  277.     static bool invokeMethod(QObject *obj, const char *member,
  278.                              Qt::ConnectionType,
  279.                              QGenericReturnArgument ret,
  280.                              QGenericArgument val0 = QGenericArgument(0),
  281.                              QGenericArgument val1 = QGenericArgument(),
  282.                              QGenericArgument val2 = QGenericArgument(),
  283.                              QGenericArgument val3 = QGenericArgument(),
  284.                              QGenericArgument val4 = QGenericArgument(),
  285.                              QGenericArgument val5 = QGenericArgument(),
  286.                              QGenericArgument val6 = QGenericArgument(),
  287.                              QGenericArgument val7 = QGenericArgument(),
  288.                              QGenericArgument val8 = QGenericArgument(),
  289.                              QGenericArgument val9 = QGenericArgument());
  290.     static inline bool invokeMethod(QObject *obj, const char *member,
  291.                              QGenericReturnArgument ret,
  292.                              QGenericArgument val0 = QGenericArgument(0),
  293.                              QGenericArgument val1 = QGenericArgument(),
  294.                              QGenericArgument val2 = QGenericArgument(),
  295.                              QGenericArgument val3 = QGenericArgument(),
  296.                              QGenericArgument val4 = QGenericArgument(),
  297.                              QGenericArgument val5 = QGenericArgument(),
  298.                              QGenericArgument val6 = QGenericArgument(),
  299.                              QGenericArgument val7 = QGenericArgument(),
  300.                              QGenericArgument val8 = QGenericArgument(),
  301.                              QGenericArgument val9 = QGenericArgument())
  302.     {
  303.         return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,
  304.                 val4, val5, val6, val7, val8, val9);
  305.     }
  306.     static inline bool invokeMethod(QObject *obj, const char *member,
  307.                              Qt::ConnectionType type,
  308.                              QGenericArgument val0 = QGenericArgument(0),
  309.                              QGenericArgument val1 = QGenericArgument(),
  310.                              QGenericArgument val2 = QGenericArgument(),
  311.                              QGenericArgument val3 = QGenericArgument(),
  312.                              QGenericArgument val4 = QGenericArgument(),
  313.                              QGenericArgument val5 = QGenericArgument(),
  314.                              QGenericArgument val6 = QGenericArgument(),
  315.                              QGenericArgument val7 = QGenericArgument(),
  316.                              QGenericArgument val8 = QGenericArgument(),
  317.                              QGenericArgument val9 = QGenericArgument())
  318.     {
  319.         return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2,
  320.                                  val3, val4, val5, val6, val7, val8, val9);
  321.     }
  322.     static inline bool invokeMethod(QObject *obj, const char *member,
  323.                              QGenericArgument val0 = QGenericArgument(0),
  324.                              QGenericArgument val1 = QGenericArgument(),
  325.                              QGenericArgument val2 = QGenericArgument(),
  326.                              QGenericArgument val3 = QGenericArgument(),
  327.                              QGenericArgument val4 = QGenericArgument(),
  328.                              QGenericArgument val5 = QGenericArgument(),
  329.                              QGenericArgument val6 = QGenericArgument(),
  330.                              QGenericArgument val7 = QGenericArgument(),
  331.                              QGenericArgument val8 = QGenericArgument(),
  332.                              QGenericArgument val9 = QGenericArgument())
  333.     {
  334.         return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,
  335.                 val1, val2, val3, val4, val5, val6, val7, val8, val9);
  336.     }
  337.     enum Call {
  338.         InvokeMetaMethod,
  339.         ReadProperty,
  340.         WriteProperty,
  341.         ResetProperty,
  342.         QueryPropertyDesignable,
  343.         QueryPropertyScriptable,
  344.         QueryPropertyStored,
  345.         QueryPropertyEditable,
  346.         QueryPropertyUser
  347.     };
  348. #ifdef QT3_SUPPORT
  349.     QT3_SUPPORT const char *superClassName() const;
  350. #endif
  351.     struct { // private data
  352.         const QMetaObject *superdata;
  353.         const char *stringdata;
  354.         const uint *data;
  355.         const QMetaObject **extradata;
  356.     } d;
  357. };
  358. inline const char *QMetaObject::className() const
  359. { return d.stringdata; }
  360. inline const QMetaObject *QMetaObject::superClass() const
  361. { return d.superdata; }
  362. #ifdef QT3_SUPPORT
  363. inline const char *QMetaObject::superClassName() const
  364. { return d.superdata ? d.superdata->className() : 0; }
  365. #endif
  366. QT_END_NAMESPACE
  367. QT_END_HEADER
  368. #endif // QOBJECTDEFS_H