Qt4与Qt5的信号槽有些不同:
1. Qt4的槽函数必须使用slots关键字声明,而Qt5中已经不再需要了,槽函数可以是任何能和信号关联的成员函数。
2. Qt4指定信号函数和槽函数需用SIGNAL和SLOT宏,它们的功能是将参数转换为const char*类型。而Qt5中传递的是信号函数和槽函数的指针。
3. Qt5支持编译时进行检查,信号或槽的拼写错误、槽函数参数多余信号函数等错误可以在编译时就检查出来,而Qt4不行。而且参数类型不需要一致,只要能隐式转换就行。
4. Qt5还支持C++11的lambda表达式,可以在关联时直接编写信号发射后要执行的代码,不再需要声明定义槽函数了。
关于connect函数的第五个参数:
有五种类型:
Qt::AutoConnection 自动关联 (默认) 如果接受者和发送者在同一个线程,则使用Qt::DirectConnection ,否则使用Qt::QueuedConnection。 在信号被发送时决定使用哪种关联类型。
Qt::DirectConnection 直接关联 发射完信号后立即调用槽,只有当槽执行完后,发射信号处后面的代码才能继续执行。
Qt::QueuedConnection 队列关联 当控制返回接受者所在的线程才执行槽函数,而且无论槽执行与否,发射信号处后面的代码都会立即执行。
Qt::BlockingQueuedConnection 阻塞队列关联 类似于队列关联,信号线程会一直阻塞,直到槽返回。但是当接受者和发送者在同一个线程时,不能使用,否则会导致死锁。
Qt::UniqueConnection 唯一关联 使用它后,两个对象间的相同信号和槽只能有唯一的关联。通常和其他连接类型做按位或操作。
信号和槽还有一种自动关联方式:
由字符串on、部件的objectName和信号名称三部分组成,中间用下划线隔开的槽函数名称可以被QT直接关联,不用再使用conncect函数。
如on_pushButton_clicked。 不过如果这样使用,还需要进行其他的设置:使用conncectSlotsByName()函数来支持信号和槽函数自动关联。
但不建议使用这种方式,信号和槽的关联情况不明了,对其他开发人员不友好。
来源:oschina
链接:https://my.oschina.net/u/4411698/blog/3683092