在 Qt 中添加一个幻灯片,使信号在 y 轴上上下移动
Add a slide in Qt that moves a signal up and down the y axis
我在同一个图表上有三个实时信号,但有时它们会重叠,我需要一个滑动按钮来将它们在 y 轴上上下移动以便更好地查看它们。如何将幻灯片连接到图表?就像当幻灯片的值发生变化时,信号的数据将被添加到图形上 real_y_values+slide_value?这是 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;
}
我在MainWindow中做了一个slot:void MainWindow::deplasare()
为了连接slide和signal,但是我想不通这个函数的内容
首先,请查看 this 以了解如何使用 QSlider。
从那里您应该明白您需要将 connect
更改为:
connect(ui->verticalSlider,SIGNAL(valueChanged(int)),this,SLOT(deplasare(int)));
现在,如果您想对其中一个图表进行某种偏移,则必须将此偏移添加到所有数据点并重新绘制。这是在 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
.
我在同一个图表上有三个实时信号,但有时它们会重叠,我需要一个滑动按钮来将它们在 y 轴上上下移动以便更好地查看它们。如何将幻灯片连接到图表?就像当幻灯片的值发生变化时,信号的数据将被添加到图形上 real_y_values+slide_value?这是 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;
}
我在MainWindow中做了一个slot:void MainWindow::deplasare()
为了连接slide和signal,但是我想不通这个函数的内容
首先,请查看 this 以了解如何使用 QSlider。
从那里您应该明白您需要将 connect
更改为:
connect(ui->verticalSlider,SIGNAL(valueChanged(int)),this,SLOT(deplasare(int)));
现在,如果您想对其中一个图表进行某种偏移,则必须将此偏移添加到所有数据点并重新绘制。这是在 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
.