在Qt中的信号槽机制中,信号能携带的参数最多不超过6个。那么超过6个时怎么办呢?

这时,可以使用QByteArray作为参数,把需要传递的参数全部打包到这一个参数里,在槽函数里再将打包的参数逐项解析出来。

信号发送:

void signal_msg11001SearchPeople(QByteArray datagram);
void SearchFriends::slot_btnSearchClicked()
{
QByteArray datagram;
QDataStream out(&datagram,QIODevice::WriteOnly);

out<<(quint8)cmbSex->currentIndex()
<<(quint8)cmbAge->currentIndex()
<<(quint8)cmbNation->currentIndex()
<<(quint8)cmbProvince->currentIndex()
<<(quint8)cmbCity->currentIndex()
<<(QString)edtKeyword->text().trimmed();

emit signal_msg11001SearchPeople(datagram);
}

信号接收:

void MySocket::slot_msg11001SearchPeople(QByteArray datagram)
{
qDebug()<<"slot_msg11001SearchPeople";
//首先从datagram参数里提取出要发送的各个字段数据
quint8 sex;
quint8 age;
quint8 nation;
quint8 province;
quint8 city;
QString keyword;

QDataStream in(&datagram,QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_5_3);
in>>sex
>>age
>>nation
>>province
>>city
>>keyword;
qDebug()<<"sex"<<sex;
qDebug()<<"age:"<<age;
qDebug()<<"nation:"<<nation;
qDebug()<<"province:"<<province;
qDebug()<<"city:"<<city;
qDebug()<<"keyword:"<<keyword;
}

注,此处由于参数中最后一个QString类型只有一个,直接解析到一个QString变量即可。(如果有连续的2个以上的QString变量,则需要先读取4字节的表示长度的数据,然后截取该长度的数据填充到QString变量,余下的变量以此类推。)(我试了下,不用这样子也可以,那位博主说的感觉有点奇怪)
运行截图:
Qt5中通过信号槽传递多个参数_数据