编译器选择错误的重载函数

Hen*_*ste 1 c++ qt signals-slots

我即将调整我的源代码到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() {
}
Run Code Online (Sandbox Code Playgroud)

编译器在connect()命令处停止并显示以下消息:

错误:C2664:'QMetaObject :: Connection QObject :: connect(const QObject*,const char*,const char*,Qt :: ConnectionType)const':无法将参数2从'const QMetaMethod'转换为'const char*'

没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符

很明显,编译器尝试使用旧语法调用重载的connect方法.我究竟做错了什么?

O'N*_*eil 5

connect()你试图使用有签名:

QMetaObject::Connection QObject::connect(
    const QObject *sender, 
    const QMetaMethod &signal,
    const QObject *receiver,
    const QMetaMethod &method,
    Qt::ConnectionType type = Qt::AutoConnection)
Run Code Online (Sandbox Code Playgroud)

注意第4 参数const QMetaMethod &method,它不是指向成员的指针,这就是你得到错误的原因.

要进行适当的转换,您可以使用:

auto metaSlot = metaObject()->method(metaObject()->indexOfSlot("signalCaught()"));
QObject::connect(sender, signal, this, metaSlot);
Run Code Online (Sandbox Code Playgroud)

但是,正如@paolo所指出的,新的信号/槽语法使用指向成员函数的指针,而不是QMetaMethod.他的解决方案可能就是你真正想要的.