2

I have three real time signals on the same graph, but sometimes they overlap and I need a slide button to move them up and down the y axis to see them better. How can I connect the slide to the graph? Like when the value of the slide changes, the datas of the signal will be added on the graph with real_y_values+slide_value? This is mainwindow.cpp:

MainWindow::MainWindow(QSerialPort* s,QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
reader(s)
{
  ui->setupUi(this);
  connect(ui->verticalSlider,SIGNAL(valueChanged(int)),ui->customPlot,SLOT(deplasare()));

  setGeometry(400, 250, 542, 390);
  grafic(ui->customPlot);
  setWindowTitle("Real Time Data Graph for EDA ");
  statusBar()->clearMessage();
  ui->customPlot->replot();

}

void MainWindow::grafic(QCustomPlot *customPlot)
{
 Graph_Name = "Real Time Data Graph for EDA";
 customPlot->addGraph(); // blue line
 customPlot->graph(0)->setPen(QPen(Qt::blue));
 customPlot->addGraph();
 customPlot->graph(1)->setPen(QPen(Qt::blue));

 customPlot->addGraph(); // red line
 customPlot->graph(2)->setPen(QPen(Qt::red));
 customPlot->addGraph();
 customPlot->graph(3)->setPen(QPen(Qt::red));

 customPlot->addGraph(); // green line
 customPlot->graph(4)->setPen(QPen(Qt::green));

 customPlot->axisRect()->setupFullAxesBox();

 connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
 dataTimer.start(100); // Interval 0 means to refresh as fast as possible
 }

 void MainWindow::realtimeDataSlot()
 {
 timeCounter+=10;
QByteArray data1;
data1=reader._read_callback();
int sz = data1.size();
int value0;
int value2=800;
int ssz=0;
for(int ii=0;ii<sz;ii++)
   if((int)data1[ii] != 13 && (int)data1[ii] != 10)
    {
        value0=(int)data1[ii];
        ssz++;
        //fct add graph
         ui->customPlot->graph(0)->addData(timeCounter, value0);
         buf.push(value0);
         ui->customPlot->graph(2)->addData(timeCounter, buf.get_SCL());
         cout<<value0<<"   "<<buf.get_SCL()<<endl;
     }




if(timeCounter>=800)
 {
      timeCounter = 0;

      ui->customPlot->graph(1)->clearData();
      ui->customPlot->graph(1)->addData(*(ui->customPlot->graph(0)->data()));
      ui->customPlot->graph(0)->clearData();

      ui->customPlot->graph(3)->clearData();
      ui->customPlot->graph(3)->addData(*(ui->customPlot->graph(2)->data()));
      ui->customPlot->graph(2)->clearData();
 }

 else {


    ui->customPlot->graph(4)->addData(timeCounter, value2);

    ui->customPlot->xAxis->setRange(0,800);
    ui->customPlot->yAxis->setRange(-300, 1024);
  }
    ui->customPlot->graph(1)->removeData(timeCounter, timeCounter+50);
    ui->customPlot->graph(3)->removeData(timeCounter, timeCounter+50);

    ui->customPlot->replot();

}
    void MainWindow::deplasare()
     {

       }

    MainWindow::~MainWindow(){

      delete ui;
     }

I made a slot in MainWindow: void MainWindow::deplasare() in order to connect the slide with the signal, but I can't figure out the content of this function.

Ana
  • 45
  • 4

1 Answers1

0

First, take a look at this in order to understand how to work with QSlider.
From there you should understand that you need to change your connect to be:

connect(ui->verticalSlider,SIGNAL(valueChanged(int)),this,SLOT(deplasare(int)));

Now if you want to make some kind of offset to one of your graphs you will have to add this offset to all data points and replot. Here is an example for doing it on your ui->customPlot->graph(0):

void MainWindow::deplasare(int offset){
    QCPDataMap *dataMap = ui->customPlot->graph(0)->data();
    for (QMap<double,QCPData>::iterator it = dataMap->begin(); it != dataMap->end(); ++it){
        it.value().value += offset;
    }
    ui->customPlot->replot();
}

Some explanation for what we see above:
Since QCPGraph data is hold in QCPDataMap that is actually a QMap<double,QCPData>. In order to add offset to every data point in the graph we iterate over the QMap and adding offset to every QCPData::value.

Community
  • 1
  • 1
A. Sarid
  • 3,916
  • 2
  • 31
  • 56
  • Thanks, it works fine, except one thing: the datas that follow are plotted with the old values – Ana Jun 12 '16 at 13:09
  • Then you should keep a track also when adding new points. Keep `offset` as a member of your class and update it with the new value each time `deplasare` is called. And when adding new values just add them with `value+offset`. – A. Sarid Jun 12 '16 at 14:21