qobject.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 QOBJECT_H
  38. #define QOBJECT_H
  39. #ifndef QT_NO_QOBJECT
  40. #include <QtCore/qobjectdefs.h>
  41. #include <QtCore/qstring.h>
  42. #include <QtCore/qbytearray.h>
  43. #include <QtCore/qlist.h>
  44. #ifdef QT_INCLUDE_COMPAT
  45. #include <QtCore/qcoreevent.h>
  46. #endif
  47. QT_BEGIN_HEADER
  48. QT_BEGIN_NAMESPACE
  49. QT_MODULE(Core)
  50. class QEvent;
  51. class QTimerEvent;
  52. class QChildEvent;
  53. struct QMetaObject;
  54. class QVariant;
  55. class QObjectPrivate;
  56. class QObject;
  57. class QThread;
  58. class QWidget;
  59. #ifndef QT_NO_REGEXP
  60. class QRegExp;
  61. #endif
  62. #ifndef QT_NO_USERDATA
  63. class QObjectUserData;
  64. #endif
  65. typedef QList<QObject*> QObjectList;
  66. #if defined Q_CC_MSVC && _MSC_VER < 1300
  67. template<typename T> inline T qFindChild(const QObject *o, const QString &name = QString(), T = 0);
  68. template<typename T> inline QList<T> qFindChildren(const QObject *o, const QString &name = QString(), T = 0);
  69. # ifndef QT_NO_REGEXP
  70. template<typename T> inline QList<T> qFindChildren(const QObject *o, const QRegExp &re, T = 0);
  71. # endif
  72. #else
  73. template<typename T> inline T qFindChild(const QObject *, const QString & = QString());
  74. template<typename T> inline QList<T> qFindChildren(const QObject *, const QString & = QString());
  75. # ifndef QT_NO_REGEXP
  76. template<typename T> inline QList<T> qFindChildren(const QObject *, const QRegExp &);
  77. # endif
  78. #endif
  79. class QObjectData {
  80. public:
  81.     virtual ~QObjectData() = 0;
  82.     QObject *q_ptr;
  83.     QObject *parent;
  84.     QObjectList children;
  85.     uint isWidget : 1;
  86.     uint pendTimer : 1;
  87.     uint blockSig : 1;
  88.     uint wasDeleted : 1;
  89.     uint ownObjectName : 1;
  90.     uint sendChildEvents : 1;
  91.     uint receiveChildEvents : 1;
  92.     uint inEventHandler : 1;
  93.     uint unused : 24;
  94.     int postedEvents;
  95. };
  96. class Q_CORE_EXPORT QObject
  97. {
  98.     Q_OBJECT
  99.     Q_PROPERTY(QString objectName READ objectName WRITE setObjectName)
  100.     Q_DECLARE_PRIVATE(QObject)
  101. public:
  102.     explicit QObject(QObject *parent=0);
  103.     virtual ~QObject();
  104.     virtual bool event(QEvent *);
  105.     virtual bool eventFilter(QObject *, QEvent *);
  106. #ifdef qdoc
  107.     static QString tr(const char *sourceText, const char *comment = 0, int n = -1);
  108.     static QString trUtf8(const char *sourceText, const char *comment = 0, int n = -1);
  109.     virtual const QMetaObject *metaObject() const;
  110.     static const QMetaObject staticMetaObject;
  111. #endif
  112. #ifdef QT_NO_TRANSLATION
  113.     static QString tr(const char *sourceText, const char *, int)
  114.         { return QString::fromLatin1(sourceText); }
  115.     static QString tr(const char *sourceText, const char * = 0)
  116.         { return QString::fromLatin1(sourceText); }
  117. #ifndef QT_NO_TEXTCODEC
  118.     static QString trUtf8(const char *sourceText, const char *, int)
  119.         { return QString::fromUtf8(sourceText); }
  120.     static QString trUtf8(const char *sourceText, const char * = 0)
  121.         { return QString::fromUtf8(sourceText); }
  122. #endif
  123. #endif //QT_NO_TRANSLATION
  124.     QString objectName() const;
  125.     void setObjectName(const QString &name);
  126.     inline bool isWidgetType() const { return d_ptr->isWidget; }
  127.     inline bool signalsBlocked() const { return d_ptr->blockSig; }
  128.     bool blockSignals(bool b);
  129.     QThread *thread() const;
  130.     void moveToThread(QThread *thread);
  131.     int startTimer(int interval);
  132.     void killTimer(int id);
  133. #ifndef QT_NO_MEMBER_TEMPLATES
  134.     template<typename T>
  135.     inline T findChild(const QString &aName = QString()) const
  136.     { return qFindChild<T>(this, aName); }
  137.     template<typename T>
  138.     inline QList<T> findChildren(const QString &aName = QString()) const
  139.     { return qFindChildren<T>(this, aName); }
  140. #ifndef QT_NO_REGEXP
  141.     template<typename T>
  142.     inline QList<T> findChildren(const QRegExp &re) const
  143.     { return qFindChildren<T>(this, re); }
  144. #endif
  145. #endif
  146. #ifdef QT3_SUPPORT
  147.     QT3_SUPPORT QObject *child(const char *objName, const char *inheritsClass = 0,
  148.                    bool recursiveSearch = true) const;
  149.     QT3_SUPPORT QObjectList queryList(const char *inheritsClass = 0,
  150.                           const char *objName = 0,
  151.                           bool regexpMatch = true,
  152.                           bool recursiveSearch = true) const;
  153. #endif
  154.     inline const QObjectList &children() const { return d_ptr->children; }
  155.     void setParent(QObject *);
  156.     void installEventFilter(QObject *);
  157.     void removeEventFilter(QObject *);
  158.     static bool connect(const QObject *sender, const char *signal,
  159.                         const QObject *receiver, const char *member, Qt::ConnectionType =
  160. #ifdef qdoc
  161.                         Qt::AutoConnection
  162. #else
  163. #ifdef QT3_SUPPORT
  164.                         Qt::AutoCompatConnection
  165. #else
  166.                         Qt::AutoConnection
  167. #endif
  168. #endif
  169.         );
  170.     inline bool connect(const QObject *sender, const char *signal,
  171.                         const char *member, Qt::ConnectionType type =
  172. #ifdef qdoc
  173.                         Qt::AutoConnection
  174. #else
  175. #ifdef QT3_SUPPORT
  176.                         Qt::AutoCompatConnection
  177. #else
  178.                         Qt::AutoConnection
  179. #endif
  180. #endif
  181.         ) const;
  182.     static bool disconnect(const QObject *sender, const char *signal,
  183.                            const QObject *receiver, const char *member);
  184.     inline bool disconnect(const char *signal = 0,
  185.                            const QObject *receiver = 0, const char *member = 0)
  186.         { return disconnect(this, signal, receiver, member); }
  187.     inline bool disconnect(const QObject *receiver, const char *member = 0)
  188.         { return disconnect(this, 0, receiver, member); }
  189.     void dumpObjectTree();
  190.     void dumpObjectInfo();
  191. #ifndef QT_NO_PROPERTIES
  192.     bool setProperty(const char *name, const QVariant &value);
  193.     QVariant property(const char *name) const;
  194.     QList<QByteArray> dynamicPropertyNames() const;
  195. #endif // QT_NO_PROPERTIES
  196. #ifndef QT_NO_USERDATA
  197.     static uint registerUserData();
  198.     void setUserData(uint id, QObjectUserData* data);
  199.     QObjectUserData* userData(uint id) const;
  200. #endif // QT_NO_USERDATA
  201. Q_SIGNALS:
  202.     void destroyed(QObject * = 0);
  203. public:
  204.     inline QObject *parent() const { return d_ptr->parent; }
  205.     inline bool inherits(const char *classname) const
  206.         { return const_cast<QObject *>(this)->qt_metacast(classname) != 0; }
  207. public Q_SLOTS:
  208.     void deleteLater();
  209. protected:
  210.     QObject *sender() const;
  211.     int receivers(const char* signal) const;
  212.     virtual void timerEvent(QTimerEvent *);
  213.     virtual void childEvent(QChildEvent *);
  214.     virtual void customEvent(QEvent *);
  215.     virtual void connectNotify(const char *signal);
  216.     virtual void disconnectNotify(const char *signal);
  217. #ifdef QT3_SUPPORT
  218. public:
  219.     QT3_SUPPORT_CONSTRUCTOR QObject(QObject *parent, const char *name);
  220.     inline QT3_SUPPORT void insertChild(QObject *o)
  221.         { if (o) o->setParent(this); }
  222.     inline QT3_SUPPORT void removeChild(QObject *o)
  223.         { if (o) o->setParent(0); }
  224.     inline QT3_SUPPORT bool isA(const char *classname) const
  225.         { return qstrcmp(classname, metaObject()->className()) == 0; }
  226.     inline QT3_SUPPORT const char *className() const { return metaObject()->className(); }
  227.     inline QT3_SUPPORT const char *name() const { return objectName().latin1_helper(); }
  228.     inline QT3_SUPPORT const char *name(const char *defaultName) const
  229.         { QString s = objectName(); return s.isEmpty()?defaultName:s.latin1_helper(); }
  230.     inline QT3_SUPPORT void setName(const char *aName) { setObjectName(QLatin1String(aName)); }
  231. protected:
  232.     inline QT3_SUPPORT bool checkConnectArgs(const char *signal,
  233.                                   const QObject *,
  234.                                   const char *member)
  235.         { return QMetaObject::checkConnectArgs(signal, member); }
  236.     static inline QT3_SUPPORT QByteArray normalizeSignalSlot(const char *signalSlot)
  237.         { return QMetaObject::normalizedSignature(signalSlot); }
  238. #endif
  239. protected:
  240.     QObject(QObjectPrivate &dd, QObject *parent = 0);
  241. protected:
  242.     QObjectData *d_ptr;
  243.     static const QMetaObject staticQtMetaObject;
  244.     friend struct QMetaObject;
  245.     friend class QApplication;
  246.     friend class QApplicationPrivate;
  247.     friend class QCoreApplication;
  248.     friend class QCoreApplicationPrivate;
  249.     friend class QWidget;
  250.     friend class QThreadData;
  251. private:
  252.     Q_DISABLE_COPY(QObject)
  253.     Q_PRIVATE_SLOT(d_func(), void _q_reregisterTimers(void *))
  254. };
  255. inline bool QObject::connect(const QObject *asender, const char *asignal,
  256.                              const char *amember, Qt::ConnectionType atype) const
  257. { return connect(asender, asignal, this, amember, atype); }
  258. #ifndef QT_NO_USERDATA
  259. class Q_CORE_EXPORT QObjectUserData {
  260. public:
  261.     virtual ~QObjectUserData();
  262. };
  263. #endif
  264. Q_CORE_EXPORT void qt_qFindChildren_helper(const QObject *parent, const QString &name, const QRegExp *re,
  265.                                            const QMetaObject &mo, QList<void *> *list);
  266. Q_CORE_EXPORT QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo);
  267. #if defined Q_CC_MSVC && _MSC_VER < 1300
  268. template<typename T>
  269. inline T qFindChild(const QObject *o, const QString &name, T)
  270. { return static_cast<T>(qt_qFindChild_helper(o, name, ((T)0)->staticMetaObject)); }
  271. template<typename T>
  272. inline QList<T> qFindChildren(const QObject *o, const QString &name, T)
  273. {
  274.     QList<T> list;
  275.     union {
  276.         QList<T> *typedList;
  277.         QList<void *> *voidList;
  278.     } u;
  279.     u.typedList = &list;
  280.     qt_qFindChildren_helper(o, name, 0, ((T)0)->staticMetaObject, u.voidList);
  281.     return list;
  282. }
  283. template<typename T>
  284. inline T qFindChild(const QObject *o, const QString &name)
  285. { return qFindChild<T>(o, name, T(0)); }
  286. template<typename T>
  287. inline T qFindChild(const QObject *o)
  288. { return qFindChild<T>(o, QString(), T(0)); }
  289. template<typename T>
  290. inline QList<T> qFindChildren(const QObject *o, const QString &name)
  291. { return qFindChildren<T>(o, name, T(0)); }
  292. template<typename T>
  293. inline QList<T> qFindChildren(const QObject *o)
  294. { return qFindChildren<T>(o, QString(), T(0)); }
  295. #ifndef QT_NO_REGEXP
  296. template<typename T>
  297. inline QList<T> qFindChildren(const QObject *o, const QRegExp &re, T)
  298. {
  299.     QList<T> list;
  300.     union {
  301.         QList<T> *typedList;
  302.         QList<void *> *voidList;
  303.     } u;
  304.     u.typedList = &list;
  305.     qt_qFindChildren_helper(o, 0, &re, ((T)0)->staticMetaObject, u.voidList);
  306.     return list;
  307. }
  308. template<typename T>
  309. inline QList<T> qFindChildren(const QObject *o, const QRegExp &re)
  310. { return qFindChildren<T>(o, re, T(0)); }
  311. #endif
  312. #ifdef Q_MOC_RUN
  313. # define Q_DECLARE_INTERFACE(IFace, IId) Q_DECLARE_INTERFACE(IFace, IId)
  314. #endif // Q_MOC_RUN
  315. template <class T> inline T qobject_cast_helper(QObject *object, T)
  316. { return static_cast<T>(((T)0)->staticMetaObject.cast(object)); }
  317. template <class T> inline T qobject_cast_helper(const QObject *object, T)
  318. { return static_cast<T>(const_cast<const QObject *>(((T)0)->staticMetaObject.cast(const_cast<QObject *>(object)))); }
  319. template <class T>
  320. inline T qobject_cast(QObject *object)
  321. { return qobject_cast_helper<T>(object, T(0)); }
  322. template <class T>
  323. inline T qobject_cast(const QObject *object)
  324. { return qobject_cast_helper<T>(object, T(0)); }
  325. #ifndef Q_MOC_RUN
  326. #  define Q_DECLARE_INTERFACE(IFace, IId) 
  327.     template <> inline IFace *qobject_cast_helper<IFace *>(QObject *object, IFace *) 
  328.     { return (IFace *)(object ? object->qt_metacast(IId) : 0); } 
  329.     template <> inline IFace *qobject_cast_helper<IFace *>(const QObject *object, IFace *) 
  330.     { return (IFace *)(object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0); }
  331. #endif // Q_MOC_RUN
  332. #else
  333. template<typename T>
  334. inline T qFindChild(const QObject *o, const QString &name)
  335. { return static_cast<T>(qt_qFindChild_helper(o, name, reinterpret_cast<T>(0)->staticMetaObject)); }
  336. template<typename T>
  337. inline QList<T> qFindChildren(const QObject *o, const QString &name)
  338. {
  339.     QList<T> list;
  340.     union {
  341.         QList<T> *typedList;
  342.         QList<void *> *voidList;
  343.     } u;
  344.     u.typedList = &list;
  345.     qt_qFindChildren_helper(o, name, 0, reinterpret_cast<T>(0)->staticMetaObject, u.voidList);
  346.     return list;
  347. }
  348. #ifndef QT_NO_REGEXP
  349. template<typename T>
  350. inline QList<T> qFindChildren(const QObject *o, const QRegExp &re)
  351. {
  352.     QList<T> list;
  353.     union {
  354.         QList<T> *typedList;
  355.         QList<void *> *voidList;
  356.     } u;
  357.     u.typedList = &list;
  358.     qt_qFindChildren_helper(o, QString(), &re, reinterpret_cast<T>(0)->staticMetaObject, u.voidList);
  359.     return list;
  360. }
  361. #endif
  362. template <class T>
  363. inline T qobject_cast(QObject *object)
  364. {
  365. #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK)
  366.     reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(object));
  367. #endif
  368.     return static_cast<T>(reinterpret_cast<T>(0)->staticMetaObject.cast(object));
  369. }
  370. template <class T>
  371. inline T qobject_cast(const QObject *object)
  372. {
  373. #if !defined(QT_NO_MEMBER_TEMPLATES) && !defined(QT_NO_QOBJECT_CHECK)
  374.     reinterpret_cast<T>(0)->qt_check_for_QOBJECT_macro(*reinterpret_cast<T>(object));
  375. #endif
  376.     return static_cast<T>(const_cast<const QObject *>(reinterpret_cast<T>(0)->staticMetaObject.cast(const_cast<QObject *>(object))));
  377. }
  378. #ifndef Q_MOC_RUN
  379. #  define Q_DECLARE_INTERFACE(IFace, IId) 
  380.     template <> inline IFace *qobject_cast<IFace *>(QObject *object) 
  381.     { return reinterpret_cast<IFace *>((object ? object->qt_metacast(IId) : 0)); } 
  382.     template <> inline IFace *qobject_cast<IFace *>(const QObject *object) 
  383.     { return reinterpret_cast<IFace *>((object ? const_cast<QObject *>(object)->qt_metacast(IId) : 0)); }
  384. #endif // Q_MOC_RUN
  385. #endif
  386. #ifndef QT_NO_DEBUG_STREAM
  387. Q_CORE_EXPORT QDebug operator<<(QDebug, const QObject *);
  388. #endif
  389. QT_END_NAMESPACE
  390. QT_END_HEADER
  391. #endif
  392. #endif // QOBJECT_H