2016-06-11 2 views
1

Ich habe drei Echtzeitsignale auf dem gleichen Graphen, aber manchmal überlappen sie und ich brauche einen Schieberegler, um sie auf der Y-Achse nach oben und unten zu bewegen sie besser. Wie kann ich die Folie mit der Grafik verbinden? Wenn sich der Wert der Folie ändert, werden die Daten des Signals im Diagramm mit read_y_values ​​+ slide_value hinzugefügt. Dies ist mainwindow.cpp:Fügen Sie einen Schieberegler in Qt hinzu, der ein Signal auf der Y-Achse nach oben und unten bewegt

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 einen Schlitz in Hauptfenster gemacht: void MainWindow::deplasare(), um den Schieber mit dem Signal zu verbinden, aber ich kann den Inhalt dieser Funktion nicht herausgefunden.

Antwort

0

Schauen Sie sich zunächst this an, um zu verstehen, wie man mit QSlider arbeitet.
Von dort aus sollten Sie verstehen, dass Sie Ihre connect ändern müssen sein:

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

Jetzt haben werden, wenn Sie irgendeine Art von Offset zu einem Ihrer Graphen machen wollen Sie dies für alle Datenpunkte Offset hinzufügen und wiederholen. Hier ist ein Beispiel dafür auf Ihrem ui->customPlot->graph(0) tun:

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

Eine Erklärung für das, was wir sehen, oben:
Da QCPGraph Daten in QCPDataMap halten, die eigentlich ein QMap<double,QCPData> ist. Um offset zu jedem Datenpunkt in dem Graph hinzuzufügen, iterieren wir über den QMap und fügen offset zu jedem QCPData::value hinzu.

+0

Danke, es funktioniert gut, außer einer Sache: die Daten, die folgen, werden mit den alten Werten – Ana

+0

geplottet. Dann sollten Sie eine Spur auch behalten, wenn Sie neue Punkte hinzufügen. Behalte 'offset' als Mitglied deiner Klasse und aktualisiere es jedes Mal mit dem neuen Wert, wenn' deplasare' aufgerufen wird. Und wenn Sie neue Werte hinzufügen, fügen Sie sie einfach mit "value + offset" hinzu. –

Verwandte Themen