当前位置: 代码迷 >> QT开发 >> Qt的槽函数怎么获得信号的发送者
  详细解决方案

Qt的槽函数怎么获得信号的发送者

热度:274   发布时间:2016-04-25 03:03:07.0
Qt的槽函数如何获得信号的发送者?
我看到一个旧帖
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();函数实现的.只是它封装了一下,让它更方便使用,.翻一下帮助就知道怎么用了.
  相关解决方案