【问题标题】:New QObject::connect syntax doesn't work新的 QObject::connect 语法不起作用
【发布时间】:2015-06-24 22:14:11
【问题描述】:

我正在使用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);

【问题讨论】:

标签: qt qobject moc qmetaobject


【解决方案1】:

将连接调用更改为此:

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

添加信息:

C++ 不知道,如果它们被覆盖(同名但参数不同),则选择哪个插槽。因此,指向插槽的指针无法提供足够的信息来解析连接。静态转换告诉编译器确切的插槽类型。与旧语法相同 - 您需要传递参数

【讨论】:

  • 我必须说我不知道​​这一点...看到这种用于重载插槽的恐怖语法让我问自己,坚持旧语法是否会更好...跨度>
  • 新的信号/槽语法是类型安全的。使用旧语法,您可以编译带有类型错误的程序。
  • C++ 不知道,如果它们被覆盖(具有不同参数的相同名称),则选择哪个插槽。因此,指向插槽的指针无法提供足够的信息来解析连接。静态转换告诉编译器确切的插槽类型。与旧语法相同 - 您需要传递参数
  • @all 我明白原因,利弊;只是说语法很恐怖,仅此而已...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多