0

QObject::connect信号をスロットに接続するための新しい構文を使用しています。

connect(m_pNetworkReply, &QNetworkReply::error, this, &MyClass::onError);

しかし、私はこの奇妙なエラーを受け取り、その理由がわかりません:

/home/user/Programming/sourcefile.cpp:131: error: no matching function for call to 'MyClass::connect(QNetworkReply*&, <unresolved overloaded function type>, MyClass* const, void (MyClass::*)(QNetworkReply::NetworkError))'
          this, &MyClass::onError);
                                        ^

奇妙なことに、古い構文を使用すると、すべて正常に動作します。

connect(m_pNetworkReply, SIGNAL(QNetworkReply::error(QNetworkReply::NetworkError)),
        this, SLOT(MyClass::onError(QNetworkReply::NetworkError)));

また、この接続は正常に機能します。

connect(m_pNetworkReply, &QNetworkReply::finished,
        this, &MyClass::replyFinished);

void onError(QNetworkReply::NetworkError);ですprivate slot

私は何を間違っていますか?

編集

これは動作するコードではないことに注意してください。このクラスは、問題を切り分けるためだけに作成しました。ただし、コードはコンパイルされるはずです。

myclass.h :

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class MyClass : public QWidget
{
    Q_OBJECT

public:
    explicit MyClass(QWidget *parent = 0);
    ~MyClass();

private slots:
    void replyFinished();
    void onError(QNetworkReply::NetworkError);
    void onSslErrors(QList<QSslError>);

private:
    QNetworkAccessManager m_networkAccessManager;
    QNetworkReply *m_pNetworkReply;

};

#endif // MYCLASS_H

myclass.cpp :

#include "myclass.h"

#include <QNetworkRequest>


MyClass::MyClass(QWidget *parent) : QWidget(parent)
{
    QNetworkRequest networkRequest;

    connect(m_pNetworkReply, &QNetworkReply::finished,
            this, &MyClass::replyFinished);
    connect(m_pNetworkReply, &QNetworkReply::error,
            this, &MyClass::onError);
    connect(m_pNetworkReply, &QNetworkReply::sslErrors,
            this, &MyClass::onSslErrors);

}

MyClass::~MyClass()
{

}

void MyClass::replyFinished()
{
    disconnect(m_pNetworkReply, &QNetworkReply::finished,
               this, &MyClass::replyFinished);
//  disconnect(m_pNetworkReply, &QNetworkReply::error,
//             this, &MyClass::onError);
    disconnect(m_pNetworkReply, &QNetworkReply::sslErrors,
               this, &MyClass::onSslErrors);

    m_pNetworkReply->deleteLater();

    close();
}

void MyClass::onError(QNetworkReply::NetworkError)
{
    disconnect(m_pNetworkReply, &QNetworkReply::finished,
               this, &MyClass::replyFinished);
//  disconnect(m_pNetworkReply, &QNetworkReply::error,
//             this, &MyClass::onError);
    disconnect(m_pNetworkReply, &QNetworkReply::sslErrors,
               this, &MyClass::onSslErrors);
}

void MyClass::onSslErrors(QList<QSslError>)
{
    disconnect(m_pNetworkReply, &QNetworkReply::finished,
               this, &MyClass::replyFinished);
//  disconnect(m_pNetworkReply, &QNetworkReply::error,
//             this, &MyClass::onError);
    disconnect(m_pNetworkReply, &QNetworkReply::sslErrors,
               this, &MyClass::onSslErrors);
}

私が得た唯一のエラーはここにあります:

connect(m_pNetworkReply, &QNetworkReply::error,
            this, &MyClass::onError);
4

1 に答える 1

6

接続呼び出しを次のように変更します。

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

追加情報:

C++ は、それらがオーバーライドされている場合にどのスロットを選択するかを知りません (同じ名前で引数が異なります)。したがって、スロットへのポインターは、接続を解決するのに十分な情報を提供しません。静的キャストは、コンパイラに正確なスロット タイプを伝えます。古い構文と同じ - 引数を渡す必要があります

于 2015-04-17T22:00:44.393 に答える