2016-06-11 4 views
1

У меня есть три сигнала в реальном времени на одном графике, но иногда они перекрываются, и мне нужна кнопка слайда, чтобы перемещать их вверх и вниз по оси y, чтобы увидеть их лучше. Как подключить слайд к графику? Как и при изменении значения слайда, данные сигнала будут добавлены на графике с помощью real_y_values ​​+ slide_value? Это mainwindow.cpp:Добавить слайд в Qt, который перемещает сигнал вверх и вниз по оси y

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; 
    } 

я сделал в слот MainWindow: void MainWindow::deplasare() для того, чтобы соединить слайд с сигналом, но я не могу понять содержание этой функции.

ответ

0

Во-первых, взгляните на this, чтобы понять, как работать с QSlider.
Оттуда вы должны понимать, что вам нужно изменить connect быть:

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

Теперь, если вы хотите сделать какой-то смещение на одну из ваших графиков вам придется добавить это смещение всех точек данных и replot. Вот пример для делать это на вашем 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(); 
} 

Некоторые объяснения для того, что мы видим выше:
Поскольку QCPGraph данные держат в QCPDataMap, что на самом деле является QMap<double,QCPData>. Чтобы добавить offset к каждой точке данных на графике, мы перебираем по QMap и добавляем offset к каждому QCPData::value.

+0

Спасибо, он отлично работает, кроме одного: последующие данные строятся со старыми значениями – Ana

+0

Затем вы должны сохранять дорожку и при добавлении новых точек. Храните 'offset' в качестве члена вашего класса и обновляйте его с новым значением каждый раз, когда вызывается' deplasare'. А при добавлении новых значений просто добавьте их с помощью 'value + offset'. –

Смежные вопросы