一、SIGNAL、SLOT
源码路径:/home/(name)/Qt5.14.2/5.14.2/Src/qtbase/src/corelib/kernel/qobjectdefs.h
Q_CORE_EXPORT const char *qFlagLocation(const char *method);
#ifndef QT_NO_META_MACROS
#ifndef QT_NO_DEBUG // Debug
#define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
#ifndef QT_NO_KEYWORDS
#define METHOD(a) qFlagLocation("0" #a QLOCATION)
#endif
#define SLOT(a) qFlagLocation("1" #a QLOCATION)
#define SIGNAL(a) qFlagLocation("2" #a QLOCATION)
#else // Release
#ifndef QT_NO_KEYWORDS
#define METHOD(a) "0" #a
#endif
#define SLOT(a) "1" #a
#define SIGNAL(a) "2" #a
#endif
#define QMETHOD_CODE 0 // member type codes
#define QSLOT_CODE 1
#define QSIGNAL_CODE 2
#endif // QT_NO_META_MACROS
由上述代码可知,关键字 SIGNAL 和 SLOT 实际上是两个宏,其功能均是将信号函数和槽函数字符串化并在前面加上标识符:1或者2,以用来区分槽和信号。
在 Debug 模式下,上述字符串中还会加入文件名和行号,用以在信号槽出错时输出响应的调试信息。
二、signals、slots、emit
源码路径:/home/(name)/Qt5.14.2/5.14.2/Src/qtbase/tests/auto/tools/moc/no-keywords.h
#define signals Q_SIGNALS
#define slots Q_SLOTS
#define emit Q_EMIT
源码路径:/home/(name)/Qt5.14.2/5.14.2/Src/qtbase/src/corelib/kernel/qobjectdefs.h
#ifndef QT_ANNOTATE_ACCESS_SPECIFIER
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)
#endif
...
#define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
#define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
#define Q_EMIT
根据上述代码可知如下:
关键字 | 实际代码 |
signals | public |
slots | (空) |
emit | (空) |
(SAW:Game Over!)