Qt:SIGNAL,SLOT宏声明

5

可能重复:
是否可以查看Qt中Q_SIGNALS、Q_SLOT、SLOT()和SIGNAL()宏的定义?

我在Google上找不到Qt中宏SIGNAL和SLOT的声明。

当我们说connect(button1, SIGNAL(clicked()), this, SLOT(slotButton1()));时,我想了解这些突出显示的宏接受哪些参数?

如果有文档链接将不胜感激。

Neil在下面的评论中提供的链接中写道:#define SLOT(a) "1"#a,这里的a代表什么?该链接没有给出。


1
请参见https://dev59.com/JkrSa4cB1Zd3GeqPXY9N。 - Neil G
2
基础知识:http://doc.qt.nokia.com/4.7/signalsandslots.html - Michael Burr
2
对于你的编辑:它们是简单的宏。#a 表示在 SLOT 括号中的 a 将被转换为字符串。(这个 # 有时被称为 "Stringizing Operator" ... 是的...) 槽和信号的 "1" 和 "2" 仅仅是为了区分两者。这里的第一个回答为您提供了更多的解释:https://dev59.com/qnI-5IYBdhLWcg3wHUjP - Bart
2
如果你对Qt中所有这些宏的作用感到困惑,你可能需要了解一下“元对象编译器”(MOC)。为了好玩,只需阅读MOC的输出并查看它对你的代码所做的更改。这应该会给你一些见解。 - Bart
1
我犹豫了一下,因为我只是提供了指向 SO 上其他帖子的链接,并且需要在我的答案中引用 @Neil 的回答。但是根据您的要求,我已经这样做了。 - Bart
显示剩余3条评论
1个回答

21

就像Neil所说的那样,SLOT和SIGNAL宏定义为

#define SLOT(a) "1"#a
#define SIGNAL(a) "2"#a

#a(使用 # a 字符串化操作符)会将圆括号中的任何内容转换为字符串字面量,以从提供给宏的签名创建名称。"1"和"2"只是用来区分插槽和信号。

此前的帖子应该会为您提供更多见解。

如果您想了解这些宏和预处理的"为什么?",我建议您阅读有关"元对象编译器"或MOC的文档。为了好玩,您可以查看MOC对您提供的代码执行的操作。浏览其输出并查看其中包含的内容。这应该很有启发性。

简而言之,通过MOC进行的这种预处理允许Qt实现一些C ++不作为标准提供的功能(例如信号和插槽)。 (尽管有一些实现这个概念的,与Qt无关,不需要元对象编译器)


1
还有一些宏什么也不做,也不会被 MOC 处理。其中之一是 emit - 它的存在仅仅是为了表达编写更具自我说明性代码的意图。 - derM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接