【问题标题】:Qt: SIGNAL, SLOT Macro declaration [duplicate]Qt:SIGNAL、SLOT 宏声明 [重复]
【发布时间】:2011-05-04 08:39:57
【问题描述】:

可能重复:
Is it possible to see definition of Q_SIGNALS, Q_SLOT, SLOT(), SIGNAL() macros? (Qt)

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

当我们说,connect(button1, SIGNAL(clicked()), this, SLOT(slotButton1()));

我想了解一下,高亮的宏接受哪些各种参数?

任何文档链接将不胜感激。

The link 我通过 Neil 的 评论如下:#define SLOT(a) "1"#a,a 在这里代表什么?它没有显示在该链接中。

【问题讨论】:

  • 致您的编辑:它们是简单的宏。 #a 表示将 SLOT 括号中的 a 变成字符串。 (这个 # 有时被称为“字符串化操作符”......是的......)插槽和信号的“1”和“2”分别只是为了区分两者。这里的第一个回复给你一些进一步的解释:stackoverflow.com/questions/2008033/…
  • 如果您想知道 Qt 中所有这些宏的“原因”,您可能需要阅读“元对象编译器”(MOC)。为了好玩,只需阅读 MOC 的输出,看看它对您的代码做了什么。这应该可以为您提供一些见解。
  • 我对此犹豫不决,因为我只是提供了指向 SO 上已经存在的其他帖子的链接,并且必须在我的回答中引用 @Neil 的回答。但根据您的要求,我已经这样做了。

标签: qt signals-slots


【解决方案1】:

正如尼尔所说,SLOT 和 SIGNAL 宏定义为

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

#a(带有#a stringizing operator)将简单地将括号内的任何内容转换为字符串文字,以根据提供给宏的签名创建名称。 “1”和“2”只是用来区分时隙和信号。

This earlier post 应该可以为您提供更多见解。

如果您想知道“为什么”?在所有这些宏的东西和预处理中,我建议你阅读“Meta-Object-Compiler”或 MOC。只是为了好玩,你可以看看 MOC 对你提供的代码做了什么。查看它的输出,看看它包含什么。这应该是相当丰富的。

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

【讨论】:

  • 还有相当多的宏什么都不做,不被MOC处理。其中之一是emit - 它的存在只是为了表达编写更多自记录代码的意图。
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多