跟踪Qt信号、槽调用
信号与槽机制是一种强大且灵活的对象间通信机制。当程序足够复杂时,信号与槽之间的调用关系会变得错综复杂,难以追踪与理解。
跟踪函数定义
// 信号调用开始
void beginCallSignal(QObject *caller, int signal_index, void **argv);
// 信号调用结束
void endCallSignal(QObject *caller, int signal_index);
// 槽调用开始
void beginCallSlot(QObject *caller, int method_index, void **argv);
// 槽调用结束
void endCallSlot(QObject *caller, int method_index);
槽调用函数参数method_index
对应的元方法可以简单通过如下方式获取:
const QMetaMethod &metaMethod = caller->metaObject()->method(method_index);
而信号调用函数参数signal_index
仅表示此信号在此对象所有信号序列中的位置。获取方法如下:
#include <private/qmetaobject_p.h>
const QMetaMethod &metaMethod = QMetaObjectPrivate::signal(caller->metaObject(), signal_index);
注册跟踪函数
#include <private/qobject_p.h>
QSignalSpyCallbackSet spySet{&beginCallSignal, &beginCallSlot, &endCallSignal, &endCallSlot};
qt_register_signal_spy_callbacks(&spySet);
引用库
CMake
find_package(Qt5 REQUIRED COMPONENTS Core)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::CorePrivate)
QMake
QT += core-private
注意
无论接收函数是否被声明为槽函数,都无法跟踪基于函数连接方式的接收函数调用。但是信号函数一定可以被跟踪到。
交流
236510798