C++ QCustomPlot-在各种选项卡中打印

C++ QCustomPlot-在各种选项卡中打印,c++,qt,qcustomplot,C++,Qt,Qcustomplot,我目前通过串行通信接收信息,请参见下面的数据输入示例: "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. 现在

我目前通过串行通信接收信息,请参见下面的数据输入示例:

"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)));
}
我省略了从传入数据中提取实际值的代码

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
}
现在我希望removeDataBeforekey_x-10删除该点之前的所有数据,因为我发现我的内存很快就填满了。键x和频率在其他地方定义

我目前的代码与上面的代码类似,但过了一段时间,一切都开始变慢,一切都延迟了。因此,我不太确定是什么错了,还是导致这种情况发生的原因。我还想知道如何使用选项卡1上的A部分、B部分、C部分和D部分的绘图,因为我不想在第一个选项卡上创建另外4个小部件来绘制数据

我希望我已经给了你足够的背景资料


提前感谢您的帮助。

关于第二个问题,很简单。 只需将图形添加到一个小部件中,并可能更改颜色等

只需对一个图形对象调用addGraph


这也可能会提高您的速度,因为您不会为每个图形对象调用replot。

我知道我可以将多个图形添加到一个小部件中,但我不太确定如何在一个小部件上获得散点图和普通图,以及如何实时获得这两个图形。不管怎么说,为了加快速度,我利用定时器,每隔一段时间就给它打个电话。看起来速度加快了一点。你想在同一个绘图或同一个小部件中使用散点和法线吗?我有一个类似的问题,我使用一个单独的线程从com端口读取您案例中的串行数据,然后该线程向需要更新的窗口发出信号。这样,我只在新数据进来时更新,而不是基于任意计时器。我希望在同一个小部件中有一个散点图和一个普通图,因此只有一个QWidget升级为QCustomPlot,并且在该小部件中有两个图。这将是一个很好的解决方案,我以前从未使用过线程,因此我不知道如何使用单独的线程读取数据,使用另一个线程更新必要的窗口。你知道有什么好的链接可以帮助我开始这项工作吗?
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
}