tcp解析和无线脑电采集
This commit is contained in:
103
testNetGUI/datatype.h
Normal file
103
testNetGUI/datatype.h
Normal file
@@ -0,0 +1,103 @@
|
||||
#ifndef DATATYPE_H
|
||||
#define DATATYPE_H
|
||||
#include <QObject>
|
||||
#include <QDataStream>
|
||||
#include <QByteArray>
|
||||
#include <QDebug>
|
||||
#include <QBuffer>
|
||||
#include <QBuffer>
|
||||
#include <QDataStream>
|
||||
#include <QByteArray>
|
||||
#include <QDebug>
|
||||
|
||||
struct DataPacket
|
||||
{
|
||||
quint8 frameHeader; // 帧头 (1 byte)
|
||||
quint32 packetSeq; // 包序号 (4 bytes)
|
||||
quint16 dataLength; // 数据块长度 (2 bytes)
|
||||
quint8 batteryLevel; // 电量 (1 byte)
|
||||
quint8 channelCount; // 通道数量 (1 byte)
|
||||
qint16 pitchAngle; // 俯仰角 (2 bytes)
|
||||
qint16 rollAngle; // 滚动角 (2 bytes)
|
||||
qint16 yawAngle; // 偏航角 (2 bytes)
|
||||
quint16 ecg; // 心电 (2 bytes)
|
||||
quint16 spo2; // 血氧 (2 bytes)
|
||||
quint8 reserved1; // 预留1 (1 byte)
|
||||
quint8 reserved2; // 预留2 (1 byte)
|
||||
quint8 reserved3; // 预留3 (1 byte)
|
||||
quint8 reserved4; // 预留4 (1 byte)
|
||||
|
||||
QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes)
|
||||
quint8 syncSource; // 同步触发源 (1 byte)
|
||||
quint8 syncSeq; // 同步触发序号 (1 byte)
|
||||
quint8 checksum; // 校验和 (1 byte)
|
||||
quint16 packetTail; // 包尾 (2 bytes)
|
||||
|
||||
// 序列化头部
|
||||
void serializeHeader(QDataStream &out )
|
||||
{
|
||||
out <<frameHeader <<packetSeq << dataLength << batteryLevel << channelCount
|
||||
<< pitchAngle << rollAngle << yawAngle << ecg << spo2
|
||||
<< reserved1 << reserved2 << reserved3 << reserved4;
|
||||
}
|
||||
|
||||
// 序列化整个数据包
|
||||
QByteArray serialize()
|
||||
{
|
||||
QByteArray buffer;
|
||||
QBuffer bufferDevice(&buffer);
|
||||
bufferDevice.open(QIODevice::WriteOnly);
|
||||
|
||||
QDataStream out(&bufferDevice);
|
||||
out.setVersion(QDataStream::Qt_5_13);
|
||||
|
||||
serializeHeader(out); // 序列化头部,但不包括校验和
|
||||
out.writeRawData(dataBlock.data(), dataBlock.size());
|
||||
out << syncSource << syncSeq;
|
||||
out << checksum;
|
||||
out << packetTail;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// 反序列化整个数据包
|
||||
void deserialize(const QByteArray &buffer) {
|
||||
QBuffer bufferDevice(const_cast<QByteArray*>(&buffer));
|
||||
bufferDevice.open(QIODevice::ReadOnly);
|
||||
|
||||
QDataStream in(&bufferDevice);
|
||||
in.setVersion(QDataStream::Qt_5_13);
|
||||
|
||||
in >>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
|
||||
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
||||
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
||||
|
||||
dataBlock.resize(dataLength);
|
||||
in.readRawData(dataBlock.data(), dataLength);
|
||||
|
||||
in >> syncSource >> syncSeq;
|
||||
|
||||
in >> checksum;
|
||||
|
||||
in >> packetTail;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void deserializeHeader(const QByteArray &buffer)
|
||||
{
|
||||
QBuffer bufferDevice(const_cast<QByteArray*>(&buffer));
|
||||
bufferDevice.open(QIODevice::ReadOnly);
|
||||
|
||||
QDataStream in(&bufferDevice);
|
||||
in.setVersion(QDataStream::Qt_5_13);
|
||||
|
||||
in >>frameHeader>> packetSeq >> dataLength >> batteryLevel >> channelCount
|
||||
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
||||
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // DATATYPE_H
|
||||
91
testNetGUI/main.cpp
Normal file
91
testNetGUI/main.cpp
Normal file
@@ -0,0 +1,91 @@
|
||||
|
||||
#include "widget.h"
|
||||
#include <QApplication>
|
||||
#include "datatype.h"
|
||||
QByteArray createAndSerializeDataPacket() {
|
||||
DataPacket packet;
|
||||
packet.frameHeader = 1;
|
||||
packet.packetSeq = 2;
|
||||
packet.dataLength = 3; // 64通道数据
|
||||
packet.batteryLevel = 4;
|
||||
packet.channelCount = 5;
|
||||
packet.pitchAngle = 6;
|
||||
packet.rollAngle = 7;
|
||||
packet.yawAngle = 8;
|
||||
packet.ecg = 9;
|
||||
packet.spo2 =10;
|
||||
packet.reserved1 = 1;
|
||||
packet.reserved2 = 2;
|
||||
packet.reserved3 = 3;
|
||||
packet.reserved4 = 4;
|
||||
|
||||
// 填充数据块
|
||||
for (int i = 0; i < 192; ++i) {
|
||||
packet.dataBlock.append(static_cast<char>(i % 256));
|
||||
}
|
||||
|
||||
packet.syncSource = 5;
|
||||
packet.syncSeq = 6;
|
||||
packet.packetTail = 8;
|
||||
|
||||
// 序列化数据包
|
||||
QByteArray serializedPacket = packet.serialize();
|
||||
qDebug() << "Serialized Packet (Hex):" << serializedPacket.toHex(' ');
|
||||
return serializedPacket;
|
||||
|
||||
}
|
||||
#include <QTextCodec>
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
|
||||
QTextCodec::setCodecForLocale(codec);
|
||||
Widget w;
|
||||
w.show();
|
||||
#if 0
|
||||
|
||||
QString data="aa0000b21403ca3d4000000000000000000692000000000000ffed4dffedddffedb6ffed56ffee1fffedadffee5affed90ffedd5ffed3cffee6bffed67ffed86ffedc7ffee1fffedb9ffee11ffedd3ffee1cffedc0ffee2cffed67ffeddfffedeeffedb9ffed5effedf1ffed8affee42ffedd7ffede9ffee43ffed2affed89ffed9bffee28ffed8fffee05ffeda8ffee3affed7cffedfaffed9fffed8cffee0fffedc0ffedb7ffee16ffed89ffedadffedecffee36ffee18ffedfaffee42ffedaaffed59ffedffffede3ffee54ffee0bffed26ffee7fffeeb80000ffed4fffede1ffedb2ffed57ffee1fffeda8ffee5effed8affeddaffed40ffee6bffed71ffed87ffedc7ffee27ffedbcffee13ffedcfffee17ffedbfffee28ffed6cffede0ffede8ffedbaffed5bffede8ffed82ffee48ffeddbffededffee44ffed2dffed88ffed96ffee24ffed8bffedffffedaaffee3cffed82ffedf8ffed9bffed93ffee11ffedbdffedb2ffee1fffed89ffedacffede8ffee36ffee16ffedf7ffee40ffeda4ffed5dffee06ffedd9ffee51ffee0cffed25ffee83ff00000000ffed55ffedddffedb1ffed54ffee22ffedafffee5cffed85ffedd9ffed40ffee72ffed6effed8affedcbffee25ffedbcffee0bffedceffee18ffedc2ffee24ffed6effede6ffededffedbbffed5cffedeeffed85ffee53ffedd6ffedf0ffee4cffed30ffed8cffed96ffee27ffed95ffee01ffedadffee39ffed82ffedf9ffed9dffed94ffee11ffedbdffedb2ffee1fffed87ffedacffede9ffee33ffee1fffedf7ffee40ffeda4ffed57ffee02ffeddeffee4cffee11ffed24ffee0000eebd0000ffed54ffeddcffedb6ffed59ffee1fffedb1ffee58ffed87ffedd4ffed46ffee6dffed70ffed86ffedcfffee22ffedb4ffee0effedd4ffee1cffedc0ffee1effed67ffede5ffedebffedbaffed5affedf2ffed88ffee4dffedd5ffedf0ffee42ffed33ffed8affeda0ffee1bffed93ffee06ffedafffee38ffed7bffedf7ffeda0ffed8fffee0effedbeffedb6ffee1fffed85ffeda8ffedf2ffee33ffee17ffedf4ffee3effeda6ffed5affedf9ffede3ffee4effee0cffed2300007dffeeb80000ffed56ffede1ffedb3ffed55ffee1effedafffee59ffed85ffedd0ffed42ffee69ffed69ffed84ffedc7ffee20ffedb6ffee18ffedcfffee1bffedbfffee25ffed64ffede1ffede9ffedbcffed58ffedf7ffed83ffee4bffedd5ffededffee45ffed2fffed8effed96ffee1affed8dffee08ffedafffee33ffed86ffedf7ffeda2ffed8fffee10ffedbaffedb4ffee1bffed8dffedaaffedf0ffee3bffee15ffedfaffee38ffeda6ffed57ffee02ffede4ffee4effee03ff0000ffee7cffeebe0000005555";
|
||||
DataPacket datapack;
|
||||
datapack.deserialize(QByteArray( data.toStdString().c_str()));
|
||||
|
||||
|
||||
qDebug()<<"包序号\n :"+QString::number(datapack.packetSeq)<<endl;;
|
||||
qDebug()<<"数据块长度 \n:"+QString::number(datapack.dataLength)<<endl;;; // 数据块长度 (2 bytes)
|
||||
qDebug()<<"电量\n"+QString::number(datapack.batteryLevel)<<endl;;; // 电量 (1 byte)
|
||||
qDebug()<<"通道数量\n"+QString::number(datapack.channelCount)<<endl;;; // 通道数量 (1 byte)
|
||||
qDebug()<<"俯仰角\n"+QString::number(datapack.pitchAngle)<<endl;;; // 俯仰角 (2 bytes)
|
||||
qDebug()<<"滚动角\n"+QString::number(datapack.rollAngle)<<endl;;; // 滚动角 (2 bytes)
|
||||
qDebug()<<"偏航角\n"+QString::number(datapack.yawAngle)<<endl;;; // 偏航角 (2 bytes)
|
||||
qDebug()<<"心电\n"+QString::number(datapack.ecg)<<endl;;; // 心电 (2 bytes)
|
||||
qDebug()<<"血氧\n"+QString::number(datapack.spo2)<<endl;;; // 血氧 (2 bytes)
|
||||
|
||||
QByteArray str = createAndSerializeDataPacket();
|
||||
DataPacket packet;
|
||||
packet.deserialize(str);
|
||||
qDebug() << "Deserialization successful"<<str;
|
||||
qDebug() << "Frame Header:" << (int)packet.frameHeader;
|
||||
qDebug() << "Packet Seq:" << packet.packetSeq;
|
||||
qDebug() << "Data Length:" << packet.dataLength;
|
||||
qDebug() << "Battery Level:" << (int)packet.batteryLevel;
|
||||
qDebug() << "Channel Count:" << (int)packet.channelCount;
|
||||
qDebug() << "Pitch Angle:" << packet.pitchAngle;
|
||||
qDebug() << "Roll Angle:" << packet.rollAngle;
|
||||
qDebug() << "Yaw Angle:" << packet.yawAngle;
|
||||
qDebug() << "ECG:" << packet.ecg;
|
||||
qDebug() << "SpO2:" << packet.spo2;
|
||||
qDebug() << "SpO2:" <<packet.reserved1 ;
|
||||
qDebug() << "SpO2:" << packet.reserved2;
|
||||
qDebug() << "SpO2:" <<packet.reserved3 ;
|
||||
qDebug() << "SpO2:" <<packet.reserved4 ;
|
||||
|
||||
qDebug() << "Sync Source:" << (int)packet.syncSource;
|
||||
qDebug() << "Sync Seq:" << (int)packet.syncSeq;
|
||||
qDebug() << "Checksum:" << (int)packet.checksum;
|
||||
qDebug() << "Packet Tail:" << packet.packetTail;
|
||||
|
||||
// 打印数据块
|
||||
qDebug() << "Data Block:" << packet.dataBlock;
|
||||
|
||||
#endif
|
||||
return a.exec();
|
||||
}
|
||||
209
testNetGUI/tcpclient.cpp
Normal file
209
testNetGUI/tcpclient.cpp
Normal file
@@ -0,0 +1,209 @@
|
||||
#include "tcpclient.h"
|
||||
#include <QDataStream>
|
||||
#include "datatype.h"
|
||||
#include <QDebug>
|
||||
TcpClient::TcpClient(QObject * parent):QObject (parent)
|
||||
{
|
||||
connect(&m_TcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadMessage()));
|
||||
connect(&m_TcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
|
||||
// 设置接收缓冲区大小
|
||||
int receiveBufferSize = 1024 * 1024; // 1MB
|
||||
m_TcpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, receiveBufferSize);
|
||||
}
|
||||
TcpClient::~TcpClient()
|
||||
{
|
||||
|
||||
disConnectServer();
|
||||
m_isConnected = false;
|
||||
|
||||
}
|
||||
bool TcpClient::disConnectServer()
|
||||
{
|
||||
if (m_TcpSocket.state() == QAbstractSocket::ConnectedState || m_TcpSocket.state() == QAbstractSocket::ConnectingState)
|
||||
{
|
||||
qDebug() << "Disconnecting from server...";
|
||||
m_TcpSocket.disconnectFromHost();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Already disconnected or not connected.";
|
||||
|
||||
}
|
||||
m_isConnected = false;
|
||||
qDebug()<<"state"<<m_TcpSocket.state()<<endl;
|
||||
return m_TcpSocket.state() == QAbstractSocket::UnconnectedState;
|
||||
|
||||
}
|
||||
|
||||
bool TcpClient::connectServer(QString ip ,qint16 port)
|
||||
{
|
||||
|
||||
//直接读取状态,如果连接正常,则直接返回
|
||||
if(m_TcpSocket.state()== QAbstractSocket::ConnectedState)
|
||||
{
|
||||
if(m_TcpSocket.isValid())
|
||||
{
|
||||
m_isConnected = true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isConnected = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//尝试连接
|
||||
m_TcpSocket.abort();//取消原有连接
|
||||
m_TcpSocket.connectToHost(ip,port);
|
||||
if(m_TcpSocket.waitForConnected(1000))
|
||||
{
|
||||
m_isConnected = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isConnected = false;
|
||||
}
|
||||
|
||||
return m_isConnected;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool TcpClient::sendMessage(QByteArray & data)
|
||||
{
|
||||
|
||||
if(!m_isConnected)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//分包发送
|
||||
const int PayloadSize = 64*1024;//一个帧数据包大小
|
||||
int totalSize = data.size();
|
||||
int bytesWritten = 0;
|
||||
int bytesToWrite = totalSize;
|
||||
while(bytesWritten<totalSize)
|
||||
{
|
||||
int startIdx = bytesWritten;
|
||||
int length = std::min(PayloadSize,bytesToWrite);
|
||||
if(startIdx+length>totalSize)
|
||||
return false;
|
||||
|
||||
QByteArray smallBlock = data.mid(startIdx,length);
|
||||
qint64 written = m_TcpSocket.write(smallBlock);
|
||||
bool success = m_TcpSocket.waitForBytesWritten();
|
||||
|
||||
if(!success)//发送失败包时,停止发送
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bytesWritten+=written;
|
||||
bytesToWrite-=written;
|
||||
}
|
||||
m_TcpSocket.flush();
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
QByteArray TcpClient::GetData()
|
||||
{
|
||||
|
||||
return QByteArray();
|
||||
}
|
||||
void TcpClient::slotTestReadMessage()
|
||||
{
|
||||
|
||||
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
||||
m_msgArray.append(temp_BtyeArray );
|
||||
//数据头大小为23个字节
|
||||
//数据块长度192或者6
|
||||
//剩余部分5
|
||||
while(!m_msgArray.isEmpty())
|
||||
{
|
||||
qint32 allSize = m_msgArray.size();
|
||||
//数据头不够
|
||||
if (allSize < 23)
|
||||
{
|
||||
qDebug()<<"sizeRcre"<<temp_BtyeArray<<endl;
|
||||
return;
|
||||
}
|
||||
DataPacket dataRec;
|
||||
dataRec.deserializeHeader(m_msgArray);
|
||||
//数据总数不够
|
||||
qint32 dataLength = dataRec.dataLength+23+5;
|
||||
if(dataRec.dataLength+23+5 >allSize )
|
||||
{
|
||||
qDebug()<<"datalength:"<<dataRec.dataLength<<temp_BtyeArray<<endl;
|
||||
return ;
|
||||
}
|
||||
dataRec.deserialize(m_msgArray);
|
||||
QByteArray readContent = m_msgArray.left(dataLength);
|
||||
m_msgArray.remove(0, dataLength);
|
||||
emit SigRectMsg(readContent);
|
||||
}
|
||||
|
||||
}
|
||||
void TcpClient::slotReadMessage()
|
||||
{
|
||||
qDebug()<<m_msgArray.size()<<endl;
|
||||
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
||||
qDebug()<<temp_BtyeArray<<endl;
|
||||
qDebug()<<temp_BtyeArray.size()<<endl;
|
||||
m_msgArray.append(temp_BtyeArray );
|
||||
quint8 frameHeader; // 帧头 (1 byte)
|
||||
quint32 packetSeq; // 包序号 (4 bytes)
|
||||
quint16 dataLength; // 数据块长度 (2 bytes)
|
||||
quint8 batteryLevel; // 电量 (1 byte)
|
||||
quint8 channelCount; // 通道数量 (1 byte)
|
||||
qint16 pitchAngle; // 俯仰角 (2 bytes)
|
||||
qint16 rollAngle; // 滚动角 (2 bytes)
|
||||
qint16 yawAngle; // 偏航角 (2 bytes)
|
||||
quint16 ecg; // 心电 (2 bytes)
|
||||
quint16 spo2; // 血氧 (2 bytes)
|
||||
quint8 reserved1; // 预留1 (1 byte)
|
||||
quint8 reserved2; // 预留2 (1 byte)
|
||||
quint8 reserved3; // 预留3 (1 byte)
|
||||
quint8 reserved4; // 预留4 (1 byte)
|
||||
|
||||
QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes)
|
||||
quint8 syncSource; // 同步触发源 (1 byte)
|
||||
quint8 syncSeq; // 同步触发序号 (1 byte)
|
||||
quint8 checksum; // 校验和 (1 byte)
|
||||
quint16 packetTail; // 包尾 (2 bytes)
|
||||
|
||||
|
||||
QDataStream in(m_msgArray);
|
||||
in.setVersion(QDataStream::Qt_5_13);
|
||||
|
||||
|
||||
|
||||
in >>frameHeader>>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
|
||||
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
||||
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
||||
qDebug()<<"---:"<<dataLength<<endl;
|
||||
dataBlock.resize(dataLength);
|
||||
in.readRawData(dataBlock.data(), dataLength);
|
||||
|
||||
in >> syncSource >> syncSeq;
|
||||
|
||||
in >> checksum;
|
||||
|
||||
in >> packetTail;
|
||||
qDebug()<<"getdataLength:"<<dataLength<<endl;
|
||||
m_msgArray.remove(0, dataLength+23+5);
|
||||
}
|
||||
|
||||
|
||||
void TcpClient::slotDisconnected()
|
||||
{
|
||||
disConnectServer();
|
||||
}
|
||||
void TcpClient::slotSendMessage(QByteArray & data)
|
||||
{
|
||||
sendMessage(data);
|
||||
}
|
||||
208
testNetGUI/tcpclient.cpp.autosave
Normal file
208
testNetGUI/tcpclient.cpp.autosave
Normal file
@@ -0,0 +1,208 @@
|
||||
#include "tcpclient.h"
|
||||
#include <QDataStream>
|
||||
#include "datatype.h"
|
||||
#include <QDebug>
|
||||
TcpClient::TcpClient(QObject * parent):QObject (parent)
|
||||
{
|
||||
connect(&m_TcpSocket,SIGNAL(readyRead()),this,SLOT(slotReadMessage()));
|
||||
connect(&m_TcpSocket,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));
|
||||
// 设置接收缓冲区大小
|
||||
int receiveBufferSize = 1024 * 1024; // 1MB
|
||||
m_TcpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, receiveBufferSize);
|
||||
}
|
||||
TcpClient::~TcpClient()
|
||||
{
|
||||
|
||||
disConnectServer();
|
||||
m_isConnected = false;
|
||||
|
||||
}
|
||||
bool TcpClient::disConnectServer()
|
||||
{
|
||||
if (m_TcpSocket.state() == QAbstractSocket::ConnectedState || m_TcpSocket.state() == QAbstractSocket::ConnectingState)
|
||||
{
|
||||
qDebug() << "Disconnecting from server...";
|
||||
m_TcpSocket.disconnectFromHost();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Already disconnected or not connected.";
|
||||
|
||||
}
|
||||
m_isConnected = false;
|
||||
qDebug()<<"state"<<m_TcpSocket.state()<<endl;
|
||||
return m_TcpSocket.state() == QAbstractSocket::UnconnectedState;
|
||||
|
||||
}
|
||||
|
||||
bool TcpClient::connectServer(QString ip ,qint16 port)
|
||||
{
|
||||
|
||||
//直接读取状态,如果连接正常,则直接返回
|
||||
if(m_TcpSocket.state()== QAbstractSocket::ConnectedState)
|
||||
{
|
||||
if(m_TcpSocket.isValid())
|
||||
{
|
||||
m_isConnected = true;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isConnected = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//尝试连接
|
||||
m_TcpSocket.abort();//取消原有连接
|
||||
m_TcpSocket.connectToHost(ip,port);
|
||||
if(m_TcpSocket.waitForConnected(1000))
|
||||
{
|
||||
m_isConnected = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_isConnected = false;
|
||||
}
|
||||
|
||||
return m_isConnected;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool TcpClient::sendMessage(QByteArray & data)
|
||||
{
|
||||
|
||||
if(!m_isConnected)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//分包发送
|
||||
const int PayloadSize = 64*1024;//一个帧数据包大小
|
||||
int totalSize = data.size();
|
||||
int bytesWritten = 0;
|
||||
int bytesToWrite = totalSize;
|
||||
while(bytesWritten<totalSize)
|
||||
{
|
||||
int startIdx = bytesWritten;
|
||||
int length = std::min(PayloadSize,bytesToWrite);
|
||||
if(startIdx+length>totalSize)
|
||||
return false;
|
||||
|
||||
QByteArray smallBlock = data.mid(startIdx,length);
|
||||
qint64 written = m_TcpSocket.write(smallBlock);
|
||||
bool success = m_TcpSocket.waitForBytesWritten();
|
||||
|
||||
if(!success)//发送失败包时,停止发送
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bytesWritten+=written;
|
||||
bytesToWrite-=written;
|
||||
}
|
||||
m_TcpSocket.flush();
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
QByteArray TcpClient::GetData()
|
||||
{
|
||||
|
||||
return QByteArray();
|
||||
}
|
||||
void TcpClient::slotTestReadMessage()
|
||||
{
|
||||
|
||||
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
||||
m_msgArray.append(temp_BtyeArray );
|
||||
//数据头大小为23个字节
|
||||
//数据块长度192或者6
|
||||
//剩余部分5
|
||||
while(!m_msgArray.isEmpty())
|
||||
{
|
||||
qint32 allSize = m_msgArray.size();
|
||||
//数据头不够
|
||||
if (allSize < 23)
|
||||
{
|
||||
qDebug()<<"sizeRcre"<<temp_BtyeArray<<endl;
|
||||
return;
|
||||
}
|
||||
DataPacket dataRec;
|
||||
dataRec.deserializeHeader(m_msgArray);
|
||||
//数据总数不够
|
||||
qint32 dataLength = dataRec.dataLength+23+5;
|
||||
if(dataRec.dataLength+23+5 >allSize )
|
||||
{
|
||||
qDebug()<<"datalength:"<<dataRec.dataLength<<temp_BtyeArray<<endl;
|
||||
return ;
|
||||
}
|
||||
dataRec.deserialize(m_msgArray);
|
||||
QByteArray readContent = m_msgArray.left(dataLength);
|
||||
m_msgArray.remove(0, dataLength);
|
||||
emit SigRectMsg(readContent);
|
||||
}
|
||||
|
||||
}
|
||||
void TcpClient::slotReadMessage()
|
||||
{
|
||||
qDebug()<<m_msgArray.size()<<endl;
|
||||
QByteArray temp_BtyeArray = m_TcpSocket.readAll();
|
||||
qDebug()<<temp_BtyeArray.size()<<endl;
|
||||
m_msgArray.append(temp_BtyeArray );
|
||||
quint8 frameHeader; // 帧头 (1 byte)
|
||||
quint32 packetSeq; // 包序号 (4 bytes)
|
||||
quint16 dataLength; // 数据块长度 (2 bytes)
|
||||
quint8 batteryLevel; // 电量 (1 byte)
|
||||
quint8 channelCount; // 通道数量 (1 byte)
|
||||
qint16 pitchAngle; // 俯仰角 (2 bytes)
|
||||
qint16 rollAngle; // 滚动角 (2 bytes)
|
||||
qint16 yawAngle; // 偏航角 (2 bytes)
|
||||
quint16 ecg; // 心电 (2 bytes)
|
||||
quint16 spo2; // 血氧 (2 bytes)
|
||||
quint8 reserved1; // 预留1 (1 byte)
|
||||
quint8 reserved2; // 预留2 (1 byte)
|
||||
quint8 reserved3; // 预留3 (1 byte)
|
||||
quint8 reserved4; // 预留4 (1 byte)
|
||||
|
||||
QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes)
|
||||
quint8 syncSource; // 同步触发源 (1 byte)
|
||||
quint8 syncSeq; // 同步触发序号 (1 byte)
|
||||
quint8 checksum; // 校验和 (1 byte)
|
||||
quint16 packetTail; // 包尾 (2 bytes)
|
||||
|
||||
|
||||
QDataStream in(m_msgArray);
|
||||
in.setVersion(QDataStream::Qt_5_13);
|
||||
|
||||
|
||||
|
||||
in >>frameHeader>>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount
|
||||
>> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2
|
||||
>> reserved1 >> reserved2 >> reserved3 >> reserved4;
|
||||
qDebug()<<"---:"<<dataLength<<endl;
|
||||
dataBlock.resize(dataLength);
|
||||
in.readRawData(dataBlock.data(), dataLength);
|
||||
|
||||
in >> syncSource >> syncSeq;
|
||||
|
||||
in >> checksum;
|
||||
|
||||
in >> packetTail;
|
||||
qDebug()<<"getdataLength:"<<dataLength<<endl;
|
||||
m_msgArray.remove(0, dataLength+23+5);
|
||||
}
|
||||
|
||||
|
||||
void TcpClient::slotDisconnected()
|
||||
{
|
||||
disConnectServer();
|
||||
}
|
||||
void TcpClient::slotSendMessage(QByteArray & data)
|
||||
{
|
||||
sendMessage(data);
|
||||
}
|
||||
41
testNetGUI/tcpclient.h
Normal file
41
testNetGUI/tcpclient.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef TCPCLIENT_H
|
||||
#define TCPCLIENT_H
|
||||
#include <QTcpSocket>
|
||||
#include <QByteArray>
|
||||
#include <QObject>
|
||||
class TcpClient:public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TcpClient(QObject * parent = nullptr);
|
||||
virtual ~TcpClient();
|
||||
/*
|
||||
des: 连接服务端
|
||||
*/
|
||||
bool connectServer(QString ip ,qint16 port);
|
||||
/*
|
||||
des: 获取数据
|
||||
*/
|
||||
QByteArray GetData();
|
||||
|
||||
bool sendMessage(QByteArray & data);
|
||||
/*
|
||||
des: 断开连接
|
||||
*/
|
||||
bool disConnectServer();
|
||||
|
||||
signals:
|
||||
void SigRectMsg(QByteArray & dataPack);
|
||||
private slots:
|
||||
|
||||
void slotReadMessage();
|
||||
void slotTestReadMessage();
|
||||
void slotDisconnected();
|
||||
void slotSendMessage(QByteArray & data);
|
||||
|
||||
private:
|
||||
QTcpSocket m_TcpSocket;
|
||||
bool m_isConnected;
|
||||
QByteArray m_msgArray;
|
||||
};
|
||||
#endif // TCPCLIENT_H
|
||||
43
testNetGUI/testNetGUI.pro
Normal file
43
testNetGUI/testNetGUI.pro
Normal file
@@ -0,0 +1,43 @@
|
||||
#-------------------------------------------------
|
||||
#
|
||||
# Project created by QtCreator 2024-10-17T16:31:11
|
||||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui network
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = testNetGUI
|
||||
TEMPLATE = app
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
CONFIG += c++11
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
tcpclient.cpp \
|
||||
widget.cpp
|
||||
|
||||
HEADERS += \
|
||||
datatype.h \
|
||||
tcpclient.h \
|
||||
widget.h
|
||||
|
||||
FORMS += \
|
||||
widget.ui
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
598
testNetGUI/testNetGUI.pro.user
Normal file
598
testNetGUI/testNetGUI.pro.user
Normal file
@@ -0,0 +1,598 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 4.9.1, 2024-10-21T17:49:15. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
<value type="QByteArray">{91b91540-c58e-40b1-bd6c-1f09b812885d}</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||
<value type="int">0</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||
<value type="QString" key="language">Cpp</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||
<value type="QString" key="language">QmlJS</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
|
||||
<value type="QString">-fno-delayed-template-parsing</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.0 MinGW 32-bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.0 MinGW 32-bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5130.win32_mingw73_kit</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_32_bit-Debug</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_32_bit-Release</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_32_bit-Profile</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||
<value type="QString">cpu-cycles</value>
|
||||
</valuelist>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||
<value type="int">0</value>
|
||||
<value type="int">1</value>
|
||||
<value type="int">2</value>
|
||||
<value type="int">3</value>
|
||||
<value type="int">4</value>
|
||||
<value type="int">5</value>
|
||||
<value type="int">6</value>
|
||||
<value type="int">7</value>
|
||||
<value type="int">8</value>
|
||||
<value type="int">9</value>
|
||||
<value type="int">10</value>
|
||||
<value type="int">11</value>
|
||||
<value type="int">12</value>
|
||||
<value type="int">13</value>
|
||||
<value type="int">14</value>
|
||||
</valuelist>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">testNetGUI</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/project/qt-project/testNetGUI/testNetGUI.pro</value>
|
||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_32_bit-Debug</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Target.1</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.0 MinGW 64-bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.0 MinGW 64-bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5130.win64_mingw73_kit</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_64_bit-Debug</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_64_bit-Release</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/project/qt-project/build-testNetGUI-Desktop_Qt_5_13_0_MinGW_64_bit-Profile</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
|
||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
|
||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
||||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||
<value type="QString">cpu-cycles</value>
|
||||
</valuelist>
|
||||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||
<value type="int">0</value>
|
||||
<value type="int">1</value>
|
||||
<value type="int">2</value>
|
||||
<value type="int">3</value>
|
||||
<value type="int">4</value>
|
||||
<value type="int">5</value>
|
||||
<value type="int">6</value>
|
||||
<value type="int">7</value>
|
||||
<value type="int">8</value>
|
||||
<value type="int">9</value>
|
||||
<value type="int">10</value>
|
||||
<value type="int">11</value>
|
||||
<value type="int">12</value>
|
||||
<value type="int">13</value>
|
||||
<value type="int">14</value>
|
||||
</valuelist>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||
<value type="QString" key="RunConfiguration.Arguments"></value>
|
||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||
<value type="int">2</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||
<value type="int">21</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>Version</variable>
|
||||
<value type="int">21</value>
|
||||
</data>
|
||||
</qtcreator>
|
||||
84
testNetGUI/widget.cpp
Normal file
84
testNetGUI/widget.cpp
Normal file
@@ -0,0 +1,84 @@
|
||||
//#pragma execution_character_set("utf-8")
|
||||
#include "widget.h"
|
||||
#include "ui_widget.h"
|
||||
#include <QMessageBox>
|
||||
Widget::Widget(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::Widget)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
connect(ui->btnConn,SIGNAL(clicked()),this,SLOT(slotConnect()));
|
||||
connect(ui->btnDis,SIGNAL(clicked()),this,SLOT(slotDisCon()));
|
||||
connect(&m_TcpClent,SIGNAL(SigRectMsg(QByteArray & )),this,SLOT(slotRec(QByteArray &)));
|
||||
ui->editIp->setText("192.168.1.11");
|
||||
ui->spnPort->setRange(1,1000000);
|
||||
ui->spnPort->setValue(5086);
|
||||
}
|
||||
|
||||
Widget::~Widget()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void Widget::slotConnect()
|
||||
{
|
||||
QString sIP = ui->editIp->text();
|
||||
int port = ui->spnPort->value();
|
||||
if( m_TcpClent.connectServer(sIP,port))
|
||||
{
|
||||
QMessageBox::information(this,"succeed"," succeed");
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this,"failed"," failed");
|
||||
}
|
||||
|
||||
}
|
||||
void Widget::slotDisCon()
|
||||
{
|
||||
|
||||
if( m_TcpClent.disConnectServer())
|
||||
{
|
||||
QMessageBox::information(this,"succeed"," succeed");
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::warning(this,"failed"," failed");
|
||||
}
|
||||
}
|
||||
void Widget::slotSend()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
void Widget::slotRec(QByteArray & data)
|
||||
{
|
||||
qDebug()<<"data---"<<data<<endl;
|
||||
DataPacket datapack;
|
||||
datapack.deserialize(data);
|
||||
#if 0
|
||||
|
||||
qDebug()<<QString::fromLocal8Bit("包序号:")+QString::number(datapack.packetSeq)<<endl;;
|
||||
qDebug()<<QString::fromLocal8Bit("数据块长度 :")+QString::number(datapack.dataLength)<<endl;;; // 数据块长度 (2 bytes)
|
||||
qDebug()<<QString::fromLocal8Bit("电量:")+QString::number(datapack.batteryLevel)<<endl;;; // 电量 (1 byte)
|
||||
qDebug()<<QString::fromLocal8Bit("通道数量:")+QString::number(datapack.channelCount)<<endl;;; // 通道数量 (1 byte)
|
||||
qDebug()<<QString::fromLocal8Bit("俯仰角:")+QString::number(datapack.pitchAngle)<<endl;;; // 俯仰角 (2 bytes)
|
||||
qDebug()<<QString::fromLocal8Bit("滚动角:")+QString::number(datapack.rollAngle)<<endl;;; // 滚动角 (2 bytes)
|
||||
qDebug()<<QString::fromLocal8Bit("偏航角:")+QString::number(datapack.yawAngle)<<endl;;; // 偏航角 (2 bytes)
|
||||
qDebug()<<QString::fromLocal8Bit("心电:")+QString::number(datapack.ecg)<<endl;;; // 心电 (2 bytes)
|
||||
qDebug()<<QString::fromLocal8Bit("血氧:")+QString::number(datapack.spo2)<<endl;;; // 血氧 (2 bytes)
|
||||
|
||||
|
||||
qDebug()<<"packetSeq :"+QString::number(datapack.packetSeq)<<endl;;
|
||||
qDebug()<<"dataLength:"+QString::number(datapack.dataLength)<<endl;;; // 数据块长度 (2 bytes)
|
||||
qDebug()<<"batteryLevel"+QString::number(datapack.batteryLevel)<<endl;;; // 电量 (1 byte)
|
||||
qDebug()<<"channelCount"+QString::number(datapack.channelCount)<<endl;;; // 通道数量 (1 byte)
|
||||
qDebug()<<"pitchAngle"+QString::number(datapack.pitchAngle)<<endl;;; // 俯仰角 (2 bytes)
|
||||
qDebug()<<"rollAngle"+QString::number(datapack.rollAngle)<<endl;;; // 滚动角 (2 bytes)
|
||||
qDebug()<<"yawAngle"+QString::number(datapack.yawAngle)<<endl;;; // 偏航角 (2 bytes)
|
||||
qDebug()<<"ecg"+QString::number(datapack.ecg)<<endl;;; // 心电 (2 bytes)
|
||||
qDebug()<<"spo2"+QString::number(datapack.spo2)<<endl;;; // 血氧 (2 bytes)
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
28
testNetGUI/widget.h
Normal file
28
testNetGUI/widget.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef WIDGET_H
|
||||
#define WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "datatype.h"
|
||||
#include "tcpclient.h"
|
||||
namespace Ui {
|
||||
class Widget;
|
||||
}
|
||||
|
||||
class Widget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Widget(QWidget *parent = nullptr);
|
||||
~Widget();
|
||||
private slots:
|
||||
void slotConnect();
|
||||
void slotDisCon();
|
||||
void slotSend();
|
||||
void slotRec(QByteArray &);
|
||||
private:
|
||||
Ui::Widget *ui;
|
||||
TcpClient m_TcpClent;
|
||||
};
|
||||
|
||||
#endif // WIDGET_H
|
||||
66
testNetGUI/widget.ui
Normal file
66
testNetGUI/widget.ui
Normal file
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Widget</class>
|
||||
<widget class="QWidget" name="Widget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>852</width>
|
||||
<height>427</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Widget</string>
|
||||
</property>
|
||||
<widget class="QPushButton" name="btnConn">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>380</x>
|
||||
<y>60</y>
|
||||
<width>93</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>连接</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QPushButton" name="btnDis">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>520</x>
|
||||
<y>60</y>
|
||||
<width>93</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>断开</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLineEdit" name="editIp">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>80</x>
|
||||
<y>60</y>
|
||||
<width>113</width>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QSpinBox" name="spnPort">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>220</x>
|
||||
<y>60</y>
|
||||
<width>131</width>
|
||||
<height>22</height>
|
||||
</rect>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
Reference in New Issue
Block a user