Qt中如何连接到QTcpSocket错误信号

How to connect to QTcpSocket error signal in Qt

我正在尝试通过使用信号和插槽来获取 QTcpSocket 错误。我喜欢这样:

connect(clientConnection->tcpSocket, &QTcpSocket::error, this, &ClientInterface::displayError);

void ClientInterface::displayError()
{
    qDebug() << clientConnection->tcpSocket->error();
    qDebug() << clientConnection->tcpSocket->errorString();
}

但是我得到这个错误:

error: no matching function for call to 'ClientInterface::connect(QTcpSocket*&, , ClientInterface*, void (ClientInterface::*)())' connect(clientConnection->tcpSocket, &QTcpSocket::error, this, &ClientInterface::displayError);

我也试过用 QAbstractSocket::SocketError 参数实现插槽,如下所示:
void displayError(QAbstractSocket::SocketError);
但它显示了同样的错误。

我哪里做错了?

编辑:

正如答案所说,我尝试这样连接:

connect(clientConnection->tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, &ClientInterface::displayError);

但是我遇到了这个问题:

QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError' (Make sure 'QAbstractSocket::SocketError' is registered using qRegisterMetaType().)

你需要重载QAbstractSocket错误:

connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),

            this, &ClientInterface::displayError);

如前所述,您需要一些重载魔法并将 QAbstractSocket::SocketError 注册为元类型。

这在 Qt 文档中也有描述:

Qt 5: http://doc.qt.io/qt-5/qabstractsocket.html#error

Qt 4.8 http://doc.qt.io/archives/qt-4.8/qabstractsocket.html#error

您也可以使用 SIGNAL(...) 宏代替函数指针语法来解决此问题:

示例:

QObject::connect(clientConnection->tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(displayError(QAbstractSocket::SocketError)));