我看到一个旧帖
http://bbs.csdn.net/topics/360256715
问题是:
例如函数:
QObject::connect(m_clientConnection, SIGNAL(readyRead()), this, SLOT(mesgRead(QTcpSocket*)));
QObject::connect(m_tcpClient, SIGNAL(readyRead()), this, SLOT(mesgRead(QTcpSocket*)));
在槽函数mesgRead中如何判断是那个QTcpSocket?, 因为我有两个QTcpSocket, 两个都用上上面的连接函数,一旦有数据来,就使用相同的槽函数, 但是槽函数如何判断是那个sender发送的呢? 有没有什么方法可以获得signal的sender?
解答在5楼:
从QTcpSocket派生一个类
加个Signal
myReadyRead(QTcpSocket*);
加个Slot
reRead();
构造方法里面
connect(this,SIGNAL(readyRead()),this,SLOT(reRead()));
void reRead()
{
emit(myReadyRead(this));
}
然后connect(m_clientConnection, SIGNAL(readyRead()), this, SLOT(mesgRead(QTcpSocket*)));
变为connect(m_clientConnection, SIGNAL(myReadyRead(QTcpSocket*)), this, SLOT(mesgRead(QTcpSocket*)));
我看了以后有点没有明白,是不是要给m_clientConnection和m_tcpClient各派生一个自己的类。就是说派生两个类,在各自的类里面实现自己的mesgRead(QTcpSocket*)?如果这样我就理解。
但是如果说用一个派生类解决这个问题,我就不明白了。求指导。
------解决思路----------------------
你这样是可行的.这个世界上没有最好的方法,只有最合适的方法.
只是觉得说得太多了,可能会影响到你.
这里如果你只有几个socket的时候,你可以用if else if来判断,但是如果你有几个十socket的时候,可能就不太好了.
一般是使用一个QMap之类的管理起来.QMap<MySocket*, DataOfSocket> 像这样,可以使用QMap的find方法找到socket对应的数据.
这个数据最少得存别人发送给你的包有多大的信息吧.因为Tcp是粘包协议.就是比如别人发两个字符符给你."123456789"和"abcdefg".有可能在mesgRead的时候只收到了"123456789",第二次才收到"abcdefg",还有可能两个字符串同时在mesgRead里面收到"123456789abcdefg".还有可能出现半包,就是"123456789",只收到一半第一次收到"12"第二次收到"3456789abcdefg".
一般会在发送数据的前面加入你发送的数据的大小. 具体不详述,网上可以找到,如果你有两个socket那么你肯定对会有两个成员变量在存它们收到的包的大小.
如果socket少还好说,如果比较多的话,就不太好操作了.需要将socket管理起来.
话说得有点远了.如果只是想分辨信号的发送者的话,貌似也只有这两种方法.你现在的函数void mesgRead(QTcpSocket* sender),如果你不继承重写,那么原来的槽函数是这样的吧,void mesgRead()没有一个参数.你只需要在槽函数里面使用
void XXX:mesgRead()
{
QTcpSocket *socket = (QTcpSocket *)sender();就可以得到信号的发送者
}
还有QSignalMapper,这个其实就是使用sender();函数实现的.只是它封装了一下,让它更方便使用,.翻一下帮助就知道怎么用了.