Qt中的SIGNAL&SLOT宏:它们做什么?

Rya*_*ang 3 macros qt signals slot

我是Qt的初学者,试图了解SIGNALand SLOT宏。当我学习使用该connect方法绑定信号和插槽时,我发现Qt官方参考页上的教程使用:

connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))
Run Code Online (Sandbox Code Playgroud)

但是,这也很好用:

connect(obj1, &Obj1::signal, obj2, &Obj2::slot)
Run Code Online (Sandbox Code Playgroud)

那么究竟是什么做的宏SIGNALSLOT办?它们是否只是在对象所属的类中寻找信号并返回其地址?

那么,为什么大多数程序员为什么不使用这些宏而不是使用它们,&Obj1::signal因为后者看起来更简单,并且如果信号函数的参数发生变化,则无需更改代码?

Che*_*byl 6

除了第一个答案。

宏 SIGNAL 和 SLOT 究竟做了什么

几乎没有。看看qobjectdefs.h

# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a
Run Code Online (Sandbox Code Playgroud)

它只是添加12。这意味着下一个代码有效并按预期工作:

QObject *obj = new QObject;
connect(obj,"2objectNameChanged(QString)",this,"1show()");//suppose this is a pointer to a QDialog subclass
obj->setObjectName("newNAme");
Run Code Online (Sandbox Code Playgroud)

为什么大多数程序员使用这些宏而不是像 &Obj1::signal 那样使用

更多细节在这里。


The*_*ght 5

在Qt 5之前,使用SIGNALSLOT宏是进行连接的唯一方法。连接是在运行时进行的,并且要求在标头中标记信号和插槽。例如:

Class MyClass : public QObject
{
    Q_OBJECT
    signals:
        void Signal();

    slots:
        void ASlotFunction();
};
Run Code Online (Sandbox Code Playgroud)

为避免重复,QT 4文档中描述其工作方式。

信号和插槽机制是Qt提供的C ++扩展的一部分,并利用了Meta Object Compiler(moc)

解释了为什么信号和插槽使用Moc。

第二个connect方法有了很大的改进,因为可以在编译时而不是运行时检查指定的功能。另外,通过使用函数的地址,您可以引用任何类函数,而不仅限于标记为插槽的部分中的那些

文档已针对Qt 5更新

此外,还有约了Qt 4连接运作良好的博客文章在这里和Qt 5 在这里