Qt5中通过信号槽传递多个参数

在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,参数个数)