Qt信号与槽宏定义

1 信号与槽的宏定义

  • METHOD,SLOT,SIGNAL宏前面对应的是字符串数字;
  • #的意思是字符串拼接;
  • METHOD,SLOT,SIGNAL宏实则就是加了前缀的字符串。
    1
    2
    3
    define METHOD(a)   "0"#a
    define SLOT(a) "1"#a
    define SIGNAL(a) "2"#a

2 信号与槽的使用

  • 先定义信号槽使用的宏SIGNALSLOT;
  • 再通过使用connect连接使用;
  • 例:
    1
    2
    3
    QPushButton *button = new QPushButton(this);
    connect(button, SIGNAL(clicked()),
    this, SIGNAL(buttonClicked()));

3 解析函数

对应宏METHOD,SLOT,SIGNAL对应判断标记QMETHOD_CODE,QSLOT_CODE,QSIGNAL_CODE的定义

1
2
3
#define QMETHOD_CODE  0 // member type codes
#define QSLOT_CODE 1
#define QSIGNAL_CODE 2


1
2
3
4
5
static int extractCode(const char *member)
{
/* extract code, ensure QMETHOD_CODE <= code <= QSIGNAL_CODE */
return (((int)(*member) - '0') & 0x3);
}

3.1 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QObject>
#include <QDebug>

static int extractCode(const char *member)
{
/* extract code, ensure QMETHOD_CODE <= code <= QSIGNAL_CODE */
return (((int)(*member) - '0') & 0x3);
}

static void exec(int code)
{
switch (code) {
case QMETHOD_CODE: qDebug()<<"METHOD"; break;
case QSLOT_CODE: qDebug()<<"SLOT"; break;
case QSIGNAL_CODE: qDebug()<<"SIGNAL"; break;
default: qDebug()<<"Unknow"; break;
}
}

int main(int argc, char *argv[])
{
int code1 = extractCode(SLOT(test()));
int code2 = extractCode(SIGNAL(test()));
int code3 = extractCode(METHOD(test()));

exec(code1);
exec(code2);
exec(code3);

return 0;
}

3.2 输出

1
2
3
SLOT
SIGNAL
METHOD

3.3 知识点

  • (((int)(*member) - '0') & 0x3)主要作用为提取第一个字符减去0的ascii码再&3的出对应的数字就是对应结果了;