首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用新的QObject::连接语法和函数指针将QSslSocket::error信号连接到插槽?

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

Stack Overflow用户
提问于 2014-12-09 12:10:38
回答 1查看 1.2K关注 0票数 5

我在试着编译这段代码。

标题:

代码语言:javascript
复制
#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

来源:

代码语言:javascript
复制
#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()函数的新语法:

代码语言:javascript
复制
QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection) [static]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 13:27:22

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

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

可编译示例:

代码语言:javascript
复制
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小版本中增加了重载,因为获取函数的地址不是我们支持的用例。但现在,如果不破坏源代码的兼容性,这是不可能的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27378658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档