我将使我的资源适应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/

10-11 22:39
查看更多