最好的方法是使用QTcpSocket
在异步模式下,通过将套接字的信号连接到相关插槽:
connect( socket, SIGNAL(connected()), this, SLOT(onConnected()) );
connect( socket, SIGNAL(readyRead()), this, SLOT(tcpReady()) );
connect( socket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(tcpError(QAbstractSocket::SocketError)) );
并在插槽中处理您的应用程序逻辑:
void MyClass::onConnected()
{
...
}
void MyClass::tcpError(QAbstractSocket::SocketError error)
{
...
}
您还可以使用本地事件循环QEventLoop
并连接信号connected
, error
, ... 你的QTcpSocket
到退出槽QEventLoop
。这样,当套接字连接或发生错误时,本地事件循环将退出并执行其余部分:
socket->connectToHost(addres,port);
QEventLoop loop;
loop.connect(socket, SIGNAL(connected()), SLOT(quit()));
loop.connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(quit()));
loop.exec();
//...
我不应该认为这是“阻塞等待而不阻塞 UI”的标准模式。