在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;
//数据处理······
}
版权属于:编码书生
本文链接:https://codess.cc/archives/208.html
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。