笔记

  在QT网络编程时,有时候需要传递结构化数据流,比如,传递结构体、固定格式的报文等;在接收函数里不适合做耗时的数据处理、分析的操作,所以就要将Buffer里的数据,传递到数据处理函数中进行处理。这里是使用槽函数来将结构化数据传递,谨以此篇笔记记录,防止以后忘了。

首先:

widget.h文件中声明信号与槽:

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
private slots:
    void UnpackMsg(QVariant vRowInfo);

signals:
    void transfer_data(QVariant);       //自定义一个信息传送信号;

};

#endif // WIDGET_H



然后在主函数中定义槽函数

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //传递数据槽  将接收到的数据传递到处理函数中进行处理;
    connect(this,SIGNAL(transfer_data(QVariant )),this,SLOT(UnpackMsg(QVariant)),Qt::QueuedConnection);

    }



在接收函数中进行数据打包,这里以串口接收为例:


void Widget::serialRead()
{
    datagram.append(serial.readAll());    //注意:串口数据接收最好延时接收,我这省略了定时器延时的步骤;
     QVector<QString> Receive_Data;  //QVector数组 接收数据;
    if(datagram.length() != 0)
        {
            ui->textBrowser->insertPlainText(tr("\n\n【收到数据来自:")+serial.portName()+tr(":")+tr("】\n"));

        //循环将接收到的数据存入 Receive_Data 数组中
            for(int i=0;i<datagram.size();i++){       //for 循环解析、转存至数组;
                char ch = datagram.at(i);
                QString tmpStr="";
                tmpStr.append(toHex[(ch&0xf0)/16]);
                tmpStr.append(toHex[ch&0x0f]);
                //tmpStr.append(" ");
                //ui->textBrowser->insertPlainText(tmpStr);
                //将接收到的QString 类型存储于数组Receive_Data中;
                Receive_Data.append(tmpStr);
            }
            //将需要传送的数据进行打包,打包成 QVariant
            QVariant DataVar;
            DataVar.setValue(Receive_Data);
            emit transfer_data(DataVar);
            DataVar.clear();

            qDebug() << datagram;
        }
    datagram.clear();  //读取完成之后需要对数组进行清空操作;
}

上面for循环遍历也很有参考意义,对于流式数据,16进制报文数据,需要遍历打印时,都可以使用该模板。



在数据处理函数中,处理数据:

void Widget::UnpackMsg(QVariant vRowInfo)
{
    //将槽函数传入的结构话数据进行还原; =>关键步骤
    QVector<QString>CurRec_Data = vRowInfo.value<QVector<QString>>();

    int rec_len = CurRec_Data.count();       //接收数据总长度;
    qDebug() << tr("接收数据总长度!");
    qDebug() << rec_len;

    qDebug() << tr("打印接收的数据!");
    qDebug() << CurRec_Data;
    
    //数据处理······
    
}
最后修改:2019 年 09 月 20 日
您的支持就是我持续更新的动力!