Qt5中使用以下方式代替Qt4的信号槽连接,在编译时即对连接的函数指针进行检测,提高了安全性。而Qt4的连接方式是基于字符串的,只能在运行时进行检测。
在Qt4的connect方法上右键 Refactor->Convert connect() to Qt 5 Style 可直接将Qt4连接方式转为Qt5连接方式。
//Qt5方法
connect(player, &MyClass::mySignal,
this, &MyWidget::mySlot);
但若是信号或槽有重载,由于这种方式没有标明参数,编译器就无法确定连接的是哪一个函数,从而报错。解决方法如下:
//直接使用Qt4方法
connect(player, SIGNAL(mySignal()), this, SLOT(mySlot()));
//Qt5第一种方法
void (MyClass::*noArgs)() = &MyClass::mySignal;//无参
void (MyClass::*withArgs)(QString, int) = &MyClass::mySignal;//有参
connect(player, noArgs, this, &MyWidget::mySlot);//连接无参的信号槽
//Qt5第二种方法
connect(slider, &QSlider::valueChanged,
lcd, static_cast<void (QLCDNumber::*)(int)>(&QLCDNumber::display));
//Qt5第三种方法
connect(slider, &QSlider::valueChanged,
lcd, QOverload<int>::of(&QLCDNumber::display));
//Qt5第四种方法(需要C++14)
connect(slider, &QSlider::valueChanged,
lcd, qOverload<int>(&QLCDNumber::display));
信号槽连接时若参数不一致,使用Qt5方法也会报错。若信号参数比槽多,则用上述任一方法将信号函数进行详细声明;若槽参数比信号多(多出的槽参数有默认值),则无法使用Qt5方法,只能使用Qt4方法连接。
另外,与QML连接信号槽也只能使用Qt4的方法。