2015-04-17 2 views
0

J'utilise la nouvelle syntaxe pour QObject::connect pour connecter un signal à une fente:New QObject :: syntaxe de connexion ne fonctionne pas

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

mais je reçois cette erreur bizarre et je ne sais pas pourquoi:

/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); 
             ^

la chose étrange est si j'utilise l'ancienne syntaxe, tout fonctionne très bien:

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

En outre, cette connexion w orks bien:

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

également void onError(QNetworkReply::NetworkError); est un private slot.

Qu'est-ce que je fais mal?

EDIT:

S'il vous plaît noter que ce n'est pas le code qui devrait fonctionner. J'ai écrit cette classe juste pour isoler le problème; le code devrait compiler si.

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); 
} 

La seule erreur que je suis ici:

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

Fournissez le code de votre classe, s'il vous plaît. – gomons

+0

@gomons fait. le code 'disconnect' commenté donne aussi des erreurs ... –

+3

duplication possible de [Connexion à QNetworkReply :: signal d'erreur] (http://stackoverflow.com/questions/14992668/connecting-to-qnetworkreplyerror-signal) – cmannett85

Répondre

6

Change connecter appel à cette :

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

Infos complémentaires:

C++ ne sait pas, quelle fente pour choisir si elles sont overrided (même nom avec des arguments différents). Ainsi, le pointeur vers un emplacement ne fournit pas assez d'informations pour résoudre la connexion. La distribution statique indique au type d'emplacement exact du compilateur. Idem avec l'ancienne syntaxe - vous devez passer des arguments

+1

Je dois dire que je ne savais pas à ce sujet ... voyant cette syntaxe d'horreur pour les machines à sous surchargées, je me demande s'il ne vaudrait pas mieux s'en tenir à l'ancienne syntaxe. –

+4

La nouvelle syntaxe signal/slot est de type safe. Avec l'ancienne syntaxe, vous pouvez compiler le programme avec des erreurs de type. – gomons

+2

C++ ne sait pas, quel emplacement choisir si elles sont remplacées (même nom avec des arguments différents). Ainsi, le pointeur vers un emplacement ne fournit pas assez d'informations pour résoudre la connexion. La distribution statique indique au type d'emplacement exact du compilateur. Même avec l'ancienne syntaxe - vous devez passer des arguments –