我将使我的资源适应Qt中的新信号和插槽语法。尽管以下声明的代码在不推荐使用的const char* signal
参数下可以很好地运行,但不适用于新的QMetaMethod &signal
语法。
class SignalWaiter : public QObject {
Q_OBJECT
public:
SignalWaiter(const QObject* sender, const QMetaMethod &signal);
private slots:
void signalCaught();
};
SignalWaiter::SignalWaiter(const QObject* sender, const QMetaMethod &signal) {
QObject::connect(sender, signal, this, &SignalWaiter::signalCaught);
}
void SignalWaiter::signalCaught() {
}
编译器在
connect()
命令停止并显示以下消息:和
因此很明显,编译器尝试使用旧语法调用重载的connect方法。我究竟做错了什么?
最佳答案
connect()
you're trying to use具有签名:
QMetaObject::Connection QObject::connect(
const QObject *sender,
const QMetaMethod &signal,
const QObject *receiver,
const QMetaMethod &method,
Qt::ConnectionType type = Qt::AutoConnection)
请注意第四个参数
const QMetaMethod &method
,它不是指向成员的指针,这就是为什么会出现错误。要进行适当的转换,可以使用:
auto metaSlot = metaObject()->method(metaObject()->indexOfSlot("signalCaught()"));
QObject::connect(sender, signal, this, metaSlot);
但是,正如@ p-a-o-l-o所指出的那样,新的信号/插槽语法使用指向成员函数的指针,而不是
QMetaMethod
。他的解决方案可能是您真正想要的。关于c++ - 编译器选择了错误的重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49856646/