我创建了一个类,用于处理从插槽接收的数据,并使用不同的参数类型创建了几个同名的重载方法。
是否可以使用重载的方法作为插槽?
到目前为止,我有两项声明:
void notify(uint uintData);
void notify(float fltData);然而,第二个在运行时生成一个警告:
QObject::connect: No such slot clsSlot::notify(float)发现这一点,这意味着它应该工作:http://doc.qt.io/qt-5/signalsandslots.html
但它不..。
来自课堂上的“clsSlot”:
public slots:
void notify(uint uintValue);
void notify(float fltValue);执行情况:
void clsSlot::notify(float fltValue) {
notifyPrimitive(meID, QString::number(fltValue));
}
void clsSlot::notify(uint uintValue) {
notifyPrimitive(meID, QString::number(uinValue));
}连接呼叫:
QObject::connect(Fcs::Mount::GetRef()
,&Fcs::Mount::signalElevation
,pobjHandler, &clsSlot::notify);pobjHandler是指向clsSlot实例的指针。
发布于 2016-05-26 14:36:08
QObject::connect(Fcs::Mount::GetRef()
,&Fcs::Mount::signalElevation
,pobjHandler, &clsSlot::notify);上面的代码的问题是有多个notify函数(即,因为它重载了)。你必须准确地说明哪一个是连接的。您可以使用强制转换来完成该操作,但在本例中,您应该只使用较早的Qt语法。例如:
connect(sender, SIGNAL(signalFn(float)), this, SLOT(notify(float)));
connect(sender, SIGNAL(signalFn(uint)), this, SLOT(notify(uint)));显然,上面的连接代码只是语法的一个例子,您需要用适当的代码填充它(例如,将sender替换为Fcs::Mount::GetRef() )。
编辑:这里是Qt文档的链接,它解释了为什么旧的语法必须用于重载。
过载 正如您在上面的示例中可能看到的,连接到QAbstractSocket::error并不是非常漂亮的,因为error有重载,而获取重载函数的地址需要显式转换,例如以前按以下方式进行的连接: 连接(mySpinBox,valueChanged(Int)),mySlider,时隙(setValue(Int)); 不能简单地转换为: 连接(mySpinBox,&QSpinBox::valueChanged,mySlider,&QSlider::setValue); ...because QSpinBox有两个名为valueChanged()的信号,具有不同的参数。相反,新的代码需要: 连接(mySpinBox,static_cast(&QSpinBox::valueChanged),mySlider,&QSlider::setValue); 一些宏可以帮助(使用c11或类型扩展)最好的可能是建议不要使信号过载或插槽… …但是我们在过去的Qt小版本中增加了重载,因为获取函数的地址不是我们支持的用例。但现在,如果不破坏源代码的兼容性,这是不可能的。
https://stackoverflow.com/questions/37463291
复制相似问题