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

5

我会尝试编译这段代码。

头文件:

#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*&, , SocketTest* const, void (SocketTest::*)(QAbstractSocket::SocketError))'

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

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

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


是的!我的Qt版本是5.3。 - mroot
1个回答

3

问题:这个类中还有另一个error()。请参见这里,因此您应该使用特殊技巧:

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

我知道这段代码很丑,但这是实现你想要的唯一方式,当然你也可以使用旧语法。
正如文档所说:
重载
正如你在示例中看到的那样,连接到QAbstractSocket::error并不美观,因为error有一个重载,而获取重载函数的地址需要显式转换。
一些宏可以帮助(使用c++11或typeof扩展)
最好的方法可能是建议不要重载信号或插槽...
...但我们已经在过去的Qt小版本中添加了重载,因为获取函数地址不是我们支持的用例。但是,现在如果不破坏源兼容性,这将是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接