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)
那么究竟是什么做的宏SIGNAL和SLOT办?它们是否只是在对象所属的类中寻找信号并返回其地址?
那么,为什么大多数程序员为什么不使用这些宏而不是使用它们,&Obj1::signal因为后者看起来更简单,并且如果信号函数的参数发生变化,则无需更改代码?
除了第一个答案。
宏 SIGNAL 和 SLOT 究竟做了什么
几乎没有。看看qobjectdefs.h:
# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
Run Code Online (Sandbox Code Playgroud)
它只是添加1或2。这意味着下一个代码有效并按预期工作:
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 那样使用
在Qt 5之前,使用SIGNAL和SLOT宏是进行连接的唯一方法。连接是在运行时进行的,并且要求在标头中标记信号和插槽。例如:
Class MyClass : public QObject
{
Q_OBJECT
signals:
void Signal();
slots:
void ASlotFunction();
};
Run Code Online (Sandbox Code Playgroud)
信号和插槽机制是Qt提供的C ++扩展的一部分,并利用了Meta Object Compiler(moc)。
这解释了为什么信号和插槽使用Moc。
第二个connect方法有了很大的改进,因为可以在编译时而不是运行时检查指定的功能。另外,通过使用函数的地址,您可以引用任何类函数,而不仅限于标记为插槽的部分中的那些:
此外,还有约了Qt 4连接运作良好的博客文章在这里和Qt 5 在这里。
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |