最近在做一个项目,用到QT 的网络通讯,并且要多线程并发的同时,还得主线程跟子线程之间传递参数。在csdn上各种搜索,最终找到了方向。原文链接是:
Qt笔记-QTcpSocket跨线程调用(官方推荐方法,非百度烂大街方法)_IT1995的博客-CSDN博客_qtcpsocket 线程
看完有点懂了 ,但是还是不是很明白,于是我去官网找到了如下部分。
以下是翻译,重点看红色部分。就是为什么可以这么做的原因。
[virtual protected]void QTcpServer::incomingConnection(qintptr socketDescriptor)
当新连接可用时,QTcpServer调用此虚拟函数。socketDescriptor参数是接受连接的本机套接字描述符。
基础工具创建QTcpSocket,设置套接字描述,然后将QTcpSocket存储在挂起连接的内部列表中。最后,发出newConnection()信号。
当连接可用时,重新实现此函数以更改服务器的行为。
如果此服务器正在使用QNetworkProxy,则socketDescriptor可能无法与本机套接字函数一起使用,只能与QTcpSocket::SetSocket描述符()一起使用。
注意:如果在该方法的重新实现中创建了另一个套接字,则需要通过调用addPendingConnection()将其添加到挂起连接机制中。
注意:如果您想将传入连接作为另一个线程中的新QtcSocket对象来处理,则必须将socketDescriptor传递给另一线程,并在那里创建QtcpSocket对象,并使用其setSocketDescroptor()方法。
另请参见newConnection()、nextPendingConnection()和addPendingConnect()。
一般为QTcpServe新建套接字QTcpSocket的时候,使用[virtual] QTcpSocket *QTcpServer::nextPendingConnection()方法,将返回值赋值给套接字对象。
当通过socketDescriptor属性新建套接字对象后,需要调用[protected] void QTcpServer::addPendingConnection(QTcpSocket *socket)方法与QTcpServer绑定,才可以自动接收QTcpServer的信号建立槽函数。