Qt的槽函数如何获得信号的发送者?
例如函数: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?
--------------------编程问答-------------------- 如果处理不同的话那就定义两个槽函数吧 --------------------编程问答--------------------
也可以使用QObject * QObject::sender () const
然后类型转化到QTcpSocket,再判断具体是哪个socket;
--------------------编程问答--------------------
这个正解!!
--------------------编程问答-------------------- 2楼正解! --------------------编程问答-------------------- lz有两种方式改变:
方案1:按照2楼说法做,但是这样违反了面向对象的思想,Qt不提倡:
connect(m_clientConnection, SIGNAL(readyRead()), this, SLOT(mesgRead()));
//Signal里没有参数Slot里也接不到参数
//然后在mesgRead()里
void mesgRead()
{
QTcpSocket* sc=dynamic_cast<QTcpSocket*>(sender());
if(sc==0)
return;
//在此添加处理代码
}
方案2:自己派生个类(比较麻烦)
从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*)));
--------------------编程问答-------------------- 虽然2楼的方法更省事,不过确实不符合面向对象的思想 --------------------编程问答-------------------- 项目不大的话建议用2楼的。 --------------------编程问答-------------------- 5L的两个方法没试。可能我的比较简单。
QObject* lSender=sender();--------------------编程问答-------------------- 用QSignalMapper映射一下 --------------------编程问答-------------------- sender()
if(lSender==0)
return ;
if(lSender->objectName()=="btnNum0")
{
emit sglEnter("0");
return ;
}
补充:移动开发 , Qt