11

Qt5の新しい接続構文を使用しています。QNetworkReplyには、エラーと呼ばれるシグナルと、エラーと呼ばれる関数があります。これにより、信号に接続しようとしたときに問題が発生します。

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'から'constcharに変換できません*'コンテキストでは、オーバーロードされた関数の曖昧性解消は許可されていません

関数ではなくシグナルに接続することをコンパイラー(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 に答える