我在试着编译这段代码。
标题:
#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::*)(QAbstractSocket::SocketError))‘:sockettest.cpp:7: sockettest.cpp:7:没有调用’SocketTest::connect‘的匹配函数(QSslSocket*&,SocketTest* const,void sockettest.cpp:7)
我想使用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()插槽?
发布于 2014-12-09 13:27:22
问题:这个类中还有另一个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或类型扩展) 最好的办法可能是建议不要使信号或插槽…过载。 …但是我们在过去的Qt小版本中增加了重载,因为获取函数的地址不是我们支持的用例。但现在,如果不破坏源代码的兼容性,这是不可能的。
https://stackoverflow.com/questions/27378658
复制相似问题