我正在尝试编译此代码。
部首:
#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()
插槽?
答案 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版本中添加了重载 因为获取函数的地址不是我们的用例 支持。但是现在如果不打破源头就不可能做到这一点 兼容性。