3500/WaveDisplay.cpp

375 lines
12 KiB
C++
Raw Normal View History

2023-04-14 19:30:30 +08:00
#include "WaveDisplay.h"
#include "ui_WaveDisplay.h"
#include "NetMgr.h"
#include <QNetworkRequest>
#include <QListView>
CWaveDisPlay::CWaveDisPlay(QWidget *parent) :
QWidget(parent),
ui(new Ui::CWaveDisPlay)
{
ui->setupUi(this);
m_ChannelID = "";
m_PackgNum = 1;
bFlag = false;
ui->widget->setProperty("flag", "Title");
ui->widget_4->setProperty("flag", "normal");
// QAbstractItemView* view = ui->comboBox_channel_2->view();
// QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect;
// effect->setBlurRadius(6);
// effect->setColor(Qt::black);
// effect->setOffset(0, 0);
// view->setGraphicsEffect(effect);
// view->update();
// static_cast<QWidget*>(view->parent())
// ->setStyleSheet(
// "QWidget{border:none;background-color: rgb(255, 255, 255);}");
// QWidget* container = static_cast<QWidget*>(view->parent());
// container->setAttribute(Qt::WA_TranslucentBackground);
// container->setWindowFlag(Qt::FramelessWindowHint);
// container->setWindowFlag(Qt::NoDropShadowWindowHint);
InitWindows();
}
CWaveDisPlay::~CWaveDisPlay()
{
delete ui;
}
void CWaveDisPlay::InitWindows()
{
ui->comboBox_channel_2->addItem("请选择通道...");
for (int i = 0; i < g_ChannelBaseInfo.size(); i++) {
ui->comboBox_channel_2->addItem(g_ChannelBaseInfo[i].channelName);
}
ui->comboBox_channel_2->setView(new QListView());
ui->comboBox_channel_2->setCurrentText("请选择通道...");
m_pNetMgr = new NetMgr(this);
ui->Btn_Timewave->setStyleSheet(" QPushButton{ border-image:url(:/image/Btn/timewave.png) 5; }\
QPushButton:hover{ border-image:url(:/image/Btn/timewave-p.png) 5; }\
QPushButton:pressed{border-image:url(:/image/Btn/timewave-p.png) 5; }\
QPushButton:checked{border-image:url(:/image/Btn/timewave-p.png) 5; } " );
ui->Btn_Timewave->setChecked(true);
//绑定HTTP消息响应
connect(m_pNetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&)));
on_comboBox_channel_2_currentTextChanged("");
tracer = new QCPItemTracer(ui->widget_wave);
tracer->setStyle(QCPItemTracer::tsCrosshair);
tracer->setPen(QPen(Qt::red));
tracer->setBrush(Qt::red);
tracer->setSize(6);
tracer->setVisible(false);
tracer->setInterpolating(false);
QFont font;
font.setPixelSize(20);
tracerLabel = new QCPItemText(ui->widget_wave);
tracerLabel->setLayer("overlay");
tracerLabel->setPen(QPen(Qt::white));
tracerLabel->setBrush(QColor(64, 156, 225));
tracerLabel->setPadding(QMargins(2,2,2,2));//边界宽度
tracerLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
tracerLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
tracerLabel->position->setCoords(0, 0);
tracerLabel->setFont(font);
tracerLabel->setText("");
Cursor();
}
void CWaveDisPlay::on_Btn_Hand_clicked()
{
ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
if(ui->Btn_Hand->isChecked()){
//交互设置
ui->widget_wave->setInteractions(QCP::iRangeDrag | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iMultiSelect);
}else if(!ui->Btn_Hand->isChecked()){
ui->widget_wave->setInteractions(QCP::iNone);
}
}
void CWaveDisPlay::on_Btn_Zoom_clicked()
{
ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmZoom);
ui->widget_wave->selectionRect()->setPen(QPen(Qt::black,1,Qt::DashLine));//虚线
ui->widget_wave->selectionRect()->setBrush(QBrush(QColor(255, 222, 173,50)));//NavajoWhite
}
void CWaveDisPlay::on_Btn_Scales_clicked()
{
ui->widget_wave->setSelectionRectMode(QCP::SelectionRectMode::srmNone);
ui->widget_wave->rescaleAxes(true);
ui->widget_wave->replot();
}
void CWaveDisPlay::on_comboBox_channel_currentTextChanged(const QString &arg1)
{
}
void CWaveDisPlay::ParseDataTimeWave(QJsonObject & objContent)
{
int packageMax = objContent["packageMax"].toInt();
int package = objContent["package"].toInt();
if(packageMax > 1 && m_PackgNum < packageMax /*&& package + 1 <= packageMax*/ && !bFlag ){
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "30");
cmdBody.insert("package",m_PackgNum);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
m_PackgNum += 1;
}
QString data = objContent["Data"].toString();
m_WaveData = m_WaveData + data + ",";
if(package + 1 == packageMax){
qDebug() << "package" <<package << "packageMax" <<packageMax << endl;
m_PackgNum = 1;
bFlag = true;
m_ListWaveData = m_WaveData.split(",");
//qDebug() << m_ListWaveData << endl;
ui->widget_wave->xAxis->setRange(0, 1);
ui->widget_wave->xAxis->setLabel("Time(s)");
double gap = (double)1/(double)m_ListWaveData.size();
double f = 0.0;
QVector<double> x,y;
QCPGraph* graph = ui->widget_wave->addGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
for(int i = 0; i < m_ListWaveData.size();i++){
f += gap;
x.push_back(f);
y.push_back(m_ListWaveData[i].toDouble());
}
qDebug() << "x" <<x.size() << "y" << y.size() << endl;
graph->setData(x,y);
ui->widget_wave->xAxis->setRange(0, 1);
on_Btn_Scales_clicked();
ui->widget_wave->replot();
}
}
void CWaveDisPlay::ParseDataFsWave(QJsonObject & objContent)
{
int packageMax = objContent["packageMax"].toInt();
int package = objContent["package"].toInt();
if(packageMax > 1 && m_PackgNum < packageMax && package + 1 <= packageMax && !bFlag ){
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "32");
cmdBody.insert("package",m_PackgNum);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
m_PackgNum += 1;
}
QString data = objContent["Data"].toString();
m_WaveData = m_WaveData + data + ",";
if(m_PackgNum == packageMax){
m_PackgNum = 1;
bFlag = true;
m_ListWaveData = m_WaveData.split(",");
//qDebug() << m_ListWaveData << endl;
ui->widget_wave->xAxis->setRange(0, 1);
ui->widget_wave->xAxis->setLabel("Fs(Hz)");
ui->widget_wave->yAxis->setLabel("Fs(Hz)");
QVector<double> x,y;
QCPGraph* graph = ui->widget_wave->addGraph(ui->widget_wave->xAxis, ui->widget_wave->yAxis);
for(int i = 0; i < m_ListWaveData.size();i++){
x.push_back(i);
y.push_back(m_ListWaveData[i].toDouble());
}
qDebug() << "x" <<x.size() << "y" << y.size() << endl;
graph->setData(x,y);
ui->widget_wave->xAxis->setRange(0, y.size());
on_Btn_Scales_clicked();
ui->widget_wave->replot();
}
}
void CWaveDisPlay::slotNetMgr(QString sAddr, const QVariant &msg)
{
QJsonObject objec = msg.value<QJsonObject>();
if(objec.contains("cmd"))
{
QJsonValue arrays_value = objec.take("cmd");
qDebug()<<"cmd ="<<arrays_value.toString();
if(arrays_value.toString() == "30"){
QJsonObject objValue = objec["content"].toObject();
ParseDataTimeWave(objValue);
} if(arrays_value.toString() == "32"){
QJsonObject objValue = objec["content"].toObject();
ParseDataFsWave(objValue);
}
}
}
void CWaveDisPlay::InitGraph()
{
m_PackgNum = 1;
bFlag = false;
ui->widget_wave->clearGraphs();
ui->widget_wave->clearPlottables();
ui->widget_wave->replot();
m_WaveData = "";
m_ListWaveData.clear();
}
void CWaveDisPlay::on_Btn_Timewave_clicked()
{
ui->Btn_Fswave->setChecked(false);
if(!ui->Btn_Timewave->isChecked()){
InitGraph();
return;
}
InitGraph();
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "30");
cmdBody.insert("package",0);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
}
void CWaveDisPlay::on_Btn_Fswave_clicked()
{
ui->Btn_Timewave->setChecked(false);
if(!ui->Btn_Fswave->isChecked()){
InitGraph();
return;
}
InitGraph();
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "32");
cmdBody.insert("package",0);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
}
void CWaveDisPlay::mouseMoveEvent(QMouseEvent *event)
{
tracer->setVisible(true);
tracerLabel->setVisible(true);
//将像素点转换成qcustomplot中的坐标值并通过setGraphKey将锚点值设为真实数据值。tracer->setGraphKey(xAxis->pixelToCoord(event->pos().x()));
int graphCount = ui->widget_wave->graphCount();
if(graphCount < 1)
return;
//获得鼠标位置处对应的横坐标数据x
double x = ui->widget_wave->xAxis->pixelToCoord(event->pos().x());
//遍历曲线
for (int i = 0; i < graphCount && tracer->visible(); ++i)
{
//显示锚点
QCPGraph *mGraph = ui->widget_wave->graph(i);
tracer->setGraph(mGraph);//将锚点设置到被选中的曲线上
tracer->setGraphKey(x); //将游标横坐标设置成刚获得的横坐标数据x
tracer->updatePosition(); //使得刚设置游标的横纵坐标位置生效
double xValue = tracer->position->key();
double yValue = tracer->position->value();
tracerLabel->setVisible(true);
tracerLabel->setText(QString("X: %1 Y: %2").arg( QString::number(xValue)).arg(QString::number(yValue)));
//显示tip框
QCPDataContainer<QCPGraphData>::const_iterator coorPoint = ui->widget_wave->graph(i)->data().data()->findBegin(xValue, true);//true代表向左搜索
}
//重绘
ui->widget_wave->replot();
}
void CWaveDisPlay::Cursor()
{
tracer->setVisible(false);
tracerLabel->setVisible(false);
connect(ui->widget_wave, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMoveEvent(QMouseEvent*)));
ui->widget_wave->replot();
}
void CWaveDisPlay::on_pushButton_refresh_clicked()
{
on_comboBox_channel_2_currentTextChanged("");
}
void CWaveDisPlay::on_comboBox_channel_2_currentTextChanged(const QString &arg1)
{
m_PackgNum = 1;
bFlag = false;
ui->widget_wave->clearGraphs();
ui->widget_wave->clearPlottables();
ui->widget_wave->replot();
m_WaveData = "";
m_ListWaveData.clear();
QString strChannelName = ui->comboBox_channel_2->currentText();
if(strChannelName == "请选择通道..."){
return;
}
int i = 0;
for (i = 0; i < g_ChannelBaseInfo.size(); i++) {
if(strChannelName == g_ChannelBaseInfo[i].channelName){
break;
}
}
m_ChannelID = g_ChannelBaseInfo[i].channelID;
if(ui->Btn_Timewave->isChecked())
{
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "30");
cmdBody.insert("package",0);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
}
else if(ui->Btn_Fswave->isChecked())
{
QJsonObject allObj,cmdBody;
allObj.insert("cmd", "32");
cmdBody.insert("package",0);
cmdBody.insert("channelId",m_ChannelID);
allObj["cmdBody"] = cmdBody;
QNetworkRequest req;
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
req.setUrl(sUrl);
m_pNetMgr->PostJson(req,allObj);
}
}