11

我正在使用 Qt5 的新连接语法。QNetworkReply 有一个称为 error 的信号和一个称为error的函数。这会在尝试连接到信号时导致问题:

connect(reply, &QNetworkReply::error, this, &MyClass::error);

错误 C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : 无法将参数 2 从 'overloaded-function' 转换为 'const char *' 上下文不允许消除重载函数的歧义

如何告诉编译器 (MSVC) 我想连接到信号而不是函数?

4

2 回答 2

17

您需要手动转换函数指针以寻址正确的函数:

connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), this, &MyClass::error);

这是对重载函数使用新语法的显着结果:

缺点:

在重载的情况下非常复杂的语法?

PS您可以在上面的链接中找到类似的示例:

 QObject::connect(socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError) {
        qDebug()<< "ERROR " << socket->errorString();
        socket->deleteLater();
    });
于 2013-02-21T01:28:34.387 回答
2

Qt 5.15 QNetworkReply::error开始不再是一个信号。幸运的是,您可以连接到&QNetworkReply::errorOccurred而不需要类型转换:

connect(reply, &QNetworkReply::errorOccurred, this,
            [reply](QNetworkReply::NetworkError) {
               qCDebug() << "Error " << reply->errorString(); 
            });
于 2020-11-02T09:55:50.180 回答