大家好,我是IT文艺男,来自一线大厂的一线程序员
上节视频给大家讲解了Qt信号槽的基本概念、元对象编译器、示例代码以及Qt宏;今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频。
Qt信号槽的宏使用
宏定义在qobjectdefs.h文件中(位于QtCore目录)
signals
#define signals Q_SIGNALS
#define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)
推导出来的结果如下,即signals就是public
#define signals public
slots
#define slots Q_SLOTS
#define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)
推导出来的结果如下,即slots为空
#define slots
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, "")
Q_OBJECT声明一些函数以及一个静态的QMetaObject对象, 这些函数的实现位于MOC所产生的源文件中;因此,这些函数的声明与实现就都有了;
精简版如下所示::
#define Q_OBJECT
public:
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_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
emit
emit宏为一个空宏; 它甚至没有被MOC解析,换句话说,emit只是可选的,没有任何意义(除了给开发人员一个提示)。
#define emit
SIGNAL
#ifndef QT_NO_DEBUG
#define QLOCATION " " __FILE__ ":" QT_STRINGIFY(__LINE__)
#define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
#else
#define SIGNAL(a) "2"#a
#endif
SLOT
#ifndef QT_NO_DEBUG
#define QLOCATION " " __FILE__ ":" QT_STRINGIFY(__LINE__)
#define SLOT(a) qFlagLocation("1"#a QLOCATION)
#else
#define SLOT(a) "1"#a
#endif
对于这些宏,下节视频我会讲解MOC以及预处理之后的代码与初始代码的对比来帮助大家更好的理解;
今天就讲解到这里,更详细的原理分析与讲解,请关注微信公众号(itwenyinan),观看对应的的视频版讲解;谢谢