В настоящее время я получаю информацию через последовательную связь, см. Ниже пример поступающих данных:
"A Ch1:45.23 Ch2:23.58 Ch3:12.45 Ch4:1.56""B Ch1:12.63 Ch2:15.45 Ch3:6.23 Ch4:45.32""C Ch1:22.20 Ch2:3.85 Ch3:2.45 Ch4:51.58""D Ch1:21.25 Ch2:2.58 Ch3:12.13 Ch4:61.52""A Ch1:4.27 Ch2:25.52 Ch3:22.15 Ch4:31.56" etc.
Теперь я пытаюсь собрать все входящие данные и построить их. Поэтому для этого я создал приложение Qt с несколькими вкладками.
Tab 1 - All Sections
Tab 2 - Section A
Tab 3 - Section B
Tab 4 - Section C
Tab 5 - Section D
Я добавил виджет на каждую вкладку и превратил его в QCustomPlot.
Я настраиваю каждый QCustomPlot следующим образом:
// Would be nice to improve this
setupGraph(ui->sectionA); // Setup Section A QCustomPlot
setupGraph(ui->sectionB); // Setup Section B QCustomPlot
setupGraph(ui->sectionC); // Setup Section C QCustomPlot
setupGraph(ui->sectionD); // Setup Section D QCustomPlot
void MainWindow::setupGraph(QCustomPlot *graphPlot)
{
QStringList legend;
legend << "Load Cell 1" << "Load Cell 2" << "Load Cell 3" << "Load Cell 4" << "Total Weight";
graphPlot->legend->setVisible(true);
graphPlot->legend->setFont(QFont("Helvetica",9));
for (int i = 0; i < legend.size(); i++)
{
graphPlot->addGraph();
graphPlot->graph(i)->setName(legend[i]);
graphPlot->graph(i)->setLineStyle(QCPGraph::lsLine);
}
graphPlot->graph(0)->setPen(QPen(Qt::blue));
graphPlot->graph(1)->setPen(QPen(Qt::red));
graphPlot->graph(2)->setPen(QPen(Qt::green));
graphPlot->graph(3)->setPen(QPen(Qt::darkCyan));
graphPlot->axisRect()->setupFullAxesBox();
graphPlot->xAxis->setRange(-10,0);
graphPlot->yAxis->setRange(0,5);
connect(graphPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), graphPlot->xAxis2, SLOT(setRange(QCPRange)));
connect(graphPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), graphPlot->yAxis2, SLOT(setRange(QCPRange)));
}
Как только это будет сделано, я открываю последовательный порт и подключаюсь к сигналу ReadyRead. Каждый раз, когда появляются новые данные, я проверяю, откуда поступают новые данные, и хочу построить их.
void MainWindow::readData()
{
QByteArray serialData;
if (serial->canReadLine())
serialData = serial->readLine();
if (serialData.startsWith('A'))
realtimePlot(ui->sectionA) // Plot the data for Section A
if (serialData.startsWith('B'))
realtimePlot(ui->sectionB) // Plot the data for Section B
if (serialData.startsWith('C'))
realtimePlot(ui->sectionC) // Plot the data for Section C
if (serialData.startsWith('D'))
realtimePlot(ui->sectionD) // Plot the data for Section D
}
Я опустил код, который извлекает фактические значения из входящих данных.
void MainWindow::realtimePlot(QCustomPlot *graphPlot)
{
range_y_min = 0;
range_y_max = 100;
// Add data to the lines
graphPlot->graph(0)->addData(key_x, ch1);
graphPlot->graph(1)->addData(key_x, ch2);
graphPlot->graph(2)->addData(key_x, ch3);
graphPlot->graph(3)->addData(key_x, ch4);
// Remove data outside the visible range
graphPlot->graph(0)->removeDataBefore(key_x-10);
graphPlot->graph(1)->removeDataBefore(key_x-10);
graphPlot->graph(2)->removeDataBefore(key_x-10);
graphPlot->graph(3)->removeDataBefore(key_x-10);
// Make the x-axis range scroll with the data (at a constant range size of 10):
graphPlot->xAxis->setRange(key_x+1/frequency,10,Qt::AlignRight);
// Set the range of the y-axis
graphPlot->yAxis->setRange(range_y_min,range_y_max+5);
// Replot the graph
graphPlot->replot();
key_x += 1/frequency; // defines horizontal gap between two data points on graph
}
Теперь я надеюсь, что removeDataBefore (key_x-10) удалит все данные до этого момента, потому что я обнаружил, что моя память заполняется довольно быстро. key_x и частота определяется где-то еще.
Код, который у меня есть (похожий на приведенный выше), работает, но через некоторое время все начинает замедляться и все задерживается. Так что я не совсем уверен, что не так или как это происходит. Я также хотел бы знать, как использовать графики для Раздела A, Раздела B, Раздела C и Раздела D на вкладке 1, поскольку я не хочу создавать еще 4 виджета на 1-й вкладке для построения графика данных.
Я надеюсь, что дал вам достаточно справочной информации.
Спасибо за вашу помощь заранее.
Что касается вашего второго вопроса, это легко.
Просто добавьте графики в один виджет (и, возможно, измените цвет и т. Д.)
Просто вызовите addGraph () для одного графического объекта.
Это также может увеличить вашу скорость, так как вы не будете вызывать replot () для каждого графического объекта.