2014-09-25 9 views
0

я в настоящее время получение информации по последовательному каналу связи, см ниже, например, из данных, поступающих в систему: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. 

Теперь то, что я пытаюсь сделать, это все входящие данные и сюжет его , Поэтому для этого я создал приложение Qt с несколькими вкладками.

Tab 1 - All Sections 
Tab 2 - Section A 
Tab 3 - Section B 
Tab 4 - Section C 
Tab 5 - Section D 

Я добавил виджет к каждой вкладке и продвинул его в QCustomPlot.

I установки каждого 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 виджета на первой вкладке для построения данных.

Надеюсь, я дал вам достаточно справочной информации.

Благодарим за помощь.

ответ

0

Что касается вашего второго вопроса, его легко. Просто добавьте графики к одному виджету (и, возможно, измените цвет и т. Д.)

Просто вызовите addGraph() для одного объекта графика.

Это может также увеличить вашу скорость, поскольку вы не будете называть replot() для каждого объекта графа.

+0

Я знаю, что могу добавить несколько графиков в один виджет, но я не совсем уверен, как получить график рассеяния и нормальный сюжет на одном виджете, а затем как заставить обоих из них находиться в режиме реального времени. Во всяком случае, чтобы немного ускорить работу, я использовал таймер и вызывал это каждый раз в то время. Казалось, это немного ускорилось. – skandebaba

+0

Вы хотите разбросать и нормально в пределах одного участка или одного и того же виджета? У меня была аналогичная проблема, я использовал отдельный поток для чтения данных (в вашем случае serial from com port), и этот поток затем передает сигнал на необходимые окна для обновления. Таким образом, я только обновляюсь, когда появляются новые данные, а не на основе произвольного таймера. –

+0

Я хотел бы иметь диаграмму рассеяния и нормальный сюжет внутри одного и того же виджета (так что только один QWidget продвигается в QCustomPlot и имеет обе графики в этом виджете). Это было бы хорошим решением, я никогда не использовал потоки раньше, поэтому я не знал, как использовать отдельный поток для чтения данных и другого потока для обновления необходимых окон. Знаете ли вы какие-либо хорошие ссылки, чтобы помочь мне начать с этого? – skandebaba

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