如何使用带有函数指针的新QObject :: connect语法将QSslSocket :: error信号连接到插槽?

时间:2014-12-09 12:10:38

标签: c++ qt

我正在尝试编译此代码。

部首:

#ifndef SOCKETTEST_H
#define SOCKETTEST_H

#include <QObject>
#include <QSslSocket>

class SocketTest : public QObject
{
    Q_OBJECT
public:
    explicit SocketTest(QObject *parent = 0);

signals:

public slots:
    void onError(QAbstractSocket::SocketError socketError);

};

#endif // SOCKETTEST_H

来源:

#include "sockettest.h"

SocketTest::SocketTest(QObject *parent) :
    QObject(parent)
{
    QSslSocket *socket = new QSslSocket(this);
    connect(socket, &QSslSocket::error, this, &SocketTest::onError);
}

但是我收到了这个错误:

sockettest.cpp:7:错误:没有用于调用'SocketTest :: connect的匹配函数(QSslSocket *&amp;,,SocketTest * const,void(SocketTest :: *)(QAbstractSocket :: SocketError))'/ p>

我想使用connect()函数的新语法:

QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection) [static]

所以,我的问题是:如何使用连接函数的新语法将QSslSocket::error()信号连接到SocketTest::onError()插槽?

1 个答案:

答案 0 :(得分:3)

问题:此课程中还有另一个error()。请参阅here,因此您应该使用特殊技巧:

  QObject::connect(socket, static_cast<void (QSslSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError) {
        qDebug()<< "ERROR " << socket->errorString();
        socket->deleteLater();
    });
}

可编辑的例子:

QSslSocket *socket = new QSslSocket(this);
connect(socket, static_cast<void (QSslSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError) {
    qDebug()<< "ERROR " << socket->errorString();
    socket->deleteLater();
});
socket->connectToHostEncrypted("imap.example.com", 993);

我知道这段代码非常难看,但它只是实现你想要的一种方式,当然你可以使用旧的语法。

正如doc所说:

  

过载

     

正如您在示例中看到的那样,连接到QAbstractSocket :: error   因为错误有一个超载,并采取了   重载函数的地址需要显式转换。

     

某些宏可以提供帮助(使用c ++ 11或类型扩展)

     

最好的事情可能是建议不要过载信号或   插槽...

     

...但我们在过去的Qt版本中添加了重载   因为获取函数的地址不是我们的用例   支持。但是现在如果不打破源头就不可能做到这一点   兼容性。