背景
①.概述
继承自 QObject 的对象若其信号或者槽函数存在重载,不可以直接进行信号槽的连接。
②.代码示例
class demoClass : public QObject
{
Q_OBJECT
public:
demoClass(QObject *parent);
~demoClass();
signals:
void demoSignal(int val);
void demoSignal(const QString & str);
};
connect 函数不会自动选择需要的重载版本:
demoClass * demo = new demoClass(this);
connect(demo, &demoClass::demoSignal, [](int var) {});
重载信号槽的连接
①.类型转换
使用 static_cast 强制转换成需要的类型:
demoClass * demo = new demoClass(this);
auto isok = connect(demo, static_cast<void (demoClass::*)(int var)>(&demoClass::demoSignal), [](int var) { });
qDebug() << "connected " << isok;
②.成员函数指针
通过定义成员函数指针的方式进行连接:
demoClass * demo = new demoClass(this);
void (demoClass::*demoSignal)(int var) = &demoClass::demoSignal;
auto isok = connect(demo, demoSignal, [](int var) { });
qDebug() << "connected " << isok;
③.QOverload
通过使用 QOverload 类确定需要的重载函数版本:
demoClass * demo = new demoClass(this);
auto isok = connect(demo, QOverload<int>::of(&demoClass::demoSignal), [](int var) {});
qDebug() << "connected " << isok;
④.Qt4 方式
也可以采用 Qt4 中信号槽连接方式:
demoClass * demo = new demoClass(this);
auto isok = connect(demo, SIGNAL(demoSignal(int)), this, SLOT(demoSlot(int)));
qDebug() << "connected " << isok;