补充第一个答案。
宏SIGNAL和SLOT到底是做什么的?
几乎什么也没做。看一下qobjectdefs.h:
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
它只是添加了1或2。这意味着下一行代码是有效的,并且能够按照预期工作:
QObject *obj = new QObject;
connect(obj,"2objectNameChanged(QString)",this,"1show()");//suppose this is a pointer to a QDialog subclass
obj->setObjectName("newNAme");
大多数程序员为什么使用这些宏而不是像 &Obj1::signal 这样的方式呢?
因为这些宏不仅适用于Qt5。
因为使用这些宏可以避免处理重载信号时带来的复杂性(可能会使代码变得混乱,而且并不简单)。
因为在新语法中,有时需要使用特定的断开连接方式。
更多细节请参见此处。