当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,所以你在对应的slot里就可以通过 sender()得到当前是谁invoke了你的slot,对应的是QObject->d->sender.
有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,
或者在TCP通讯时多个客户端同时发送给服务端,需要判断到底是哪个客户端emit了这个sgnal,
根据sender的不同来进行不同的处理.
QObject::Sender()返回发送信号的对象的指针,返回类型为QObject *
//你在一个槽里面,调用这个函数,返回的就是你信号来源的对象;
QPushButton *push= new QPushButton(this);
connect(push, SIGNAL(Click()), this, SLOT(Onpush());
void Onpush(){
QPushButton *button = (QPushButton*) sender();
}
这个button就是push这个对象来的。
void CardTCPServer::readyRead()
{
QTcpSocket *client = (QTcpSocket *)this->sender();
client->peerAddress();
QString str1 = QString("client[%1:%2]").arg(client->peerAddress().toString())
.arg(client->peerPort());
QString strNetData;
while (!client->atEnd())//没有读到末尾一直读
{
strNetData.append(QString(client->readAll()));
}
qDebug() << "recv:" << strNetData;
}