//functions for plotting graph
void MainWindow::opengraph()
{
QDialog* graphdialog = new QDialog;
Ui::graph ui_graph ;
ui_graph.setupUi(graphdialog);
setGeometry(400, 250, 542, 390);
setWindowTitle("Graph");
//statusBar()->clearMessage();
//currentDemoIndex = demoIndex;
ui_graph.customPlot->replot();
RealtimeDataGraph(ui_graph.customPlot);
}
void MainWindow::RealtimeDataGraph(QCustomPlot *customPlot)
{
#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0)
QMessageBox::critical(this, "", "You're using Qt < 4.7, the realtime data demo needs functions that are available with Qt 4.7 to work properly");
#endif
//demoName = "Real Time Data Demo";
// include this section to fully disable antialiasing for higher performance:
/*
customPlot->setNotAntialiasedElements(QCP::aeAll);
QFont font;
font.setStyleStrategy(QFont::NoAntialias);
customPlot->xAxis->setTickLabelFont(font);
customPlot->yAxis->setTickLabelFont(font);
customPlot->legend->setFont(font);
*/
customPlot->addGraph(); // blue line
customPlot->graph(0)->setPen(QPen(Qt::blue));
customPlot->graph(0)->setBrush(QBrush(QColor(240, 255, 200)));
customPlot->graph(0)->setAntialiasedFill(false);
customPlot->addGraph(); // red line
customPlot->graph(1)->setPen(QPen(Qt::red));
customPlot->graph(0)->setChannelFillGraph(customPlot->graph(1));
//
// customPlot->addGraph(); // green line
// customPlot->graph(2)->setPen(QPen(Qt::green));
// customPlot->graph(0)->setChannelFillGraph(customPlot->graph(2));
//
customPlot->addGraph(); // blue dot
customPlot->graph(2)->setPen(QPen(Qt::blue));
customPlot->graph(2)->setLineStyle(QCPGraph::lsNone);
customPlot->graph(2)->setScatterStyle(QCP::ssDisc);
customPlot->addGraph(); // red dot
customPlot->graph(3)->setPen(QPen(Qt::red));
customPlot->graph(3)->setLineStyle(QCPGraph::lsNone);
customPlot->graph(3)->setScatterStyle(QCP::ssDisc);
// customPlot->addGraph(); // green dot
// customPlot->graph(5)->setPen(QPen(Qt::green));
// customPlot->graph(5)->setLineStyle(QCPGraph::lsNone);
// customPlot->graph(5)->setScatterStyle(QCP::ssDisc);
//
customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
customPlot->xAxis->setDateTimeFormat("hh:mm:ss");
customPlot->xAxis->setAutoTickStep(false);
customPlot->xAxis->setTickStep(2);
customPlot->setupFullAxesBox();
customPlot->xAxis->setLabel("Time(Sec)");
customPlot->yAxis->setLabel("magnitude");
// make left and bottom axes transfer their ranges to right and top axes:
connect(customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->xAxis2, SLOT(setRange(QCPRange)));
connect(customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->yAxis2, SLOT(setRange(QCPRange)));
// setup a timer that repeatedly calls MainWindow::realtimeDataSlot:
*connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot(QCustomPlot *)));*
dataTimer.start(0); // Interval 0 means to refresh as fast as possible
}
void MainWindow::realtimeDataSlot(QCustomPlot *customPlot)
{
// calculate two new data points:
#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0)
double key = 0;
#else
double key = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
#endif
static double lastPointKey = 0;
if (key-lastPointKey > 0.01) // at most add point every 10 ms
{
double value0 = sin(key*1.6+cos(key*1.7)*2)*10 + sin(key*1.2+0.56)*20 + 26;
double value1 = sin(key*1.3+cos(key*1.2)*1.2)*7 + sin(key*0.9+0.26)*24 + 26;
//
//double value2 = sin(key*2+cos(key*2.2)*3)*17 + sin(key*2.3+0.76)*30 + 26;
//
// add data to lines:
customPlot->graph(0)->addData(key, value0);
customPlot->graph(1)->addData(key, value1);
//
// ui->customPlot->graph(1)->addData(key, value2);
// set data of dots:
customPlot->graph(2)->clearData();
customPlot->graph(2)->addData(key, value0);
customPlot->graph(3)->clearData();
customPlot->graph(3)->addData(key, value1);
// ui->customPlot->graph(5)->clearData();
// ui->customPlot->graph(5)->addData(key, value2);
// remove data of lines that's outside visible range:
customPlot->graph(0)->removeDataBefore(key-20);
customPlot->graph(1)->removeDataBefore(key-20);
// ui->customPlot->graph(2)->removeDataBefore(key-20);
// rescale value (vertical) axis to fit the current data:
customPlot->graph(0)->rescaleValueAxis();
customPlot->graph(1)->rescaleValueAxis(true);
// ui->customPlot->graph(2)->rescaleValueAxis(true);
lastPointKey = key;
}
// make key axis range scroll with the data (at a constant range size of 8):
customPlot->xAxis->setRange(key+0.25, 20, Qt::AlignRight);
customPlot->replot();
// calculate frames per second:
static double lastFpsKey;
static int frameCount;
++frameCount;
if (key-lastFpsKey > 2) // average fps over 2 seconds
{
//ui->statusBar->showMessage(
// QString("%1 FPS, Total Data points: %2")
// .arg(frameCount/(key-lastFpsKey), 0, 'f', 0)
// .arg(ui->customPlot->graph(0)->data()->count()+ui->customPlot->graph(1)->data()->count())
// , 0);
lastFpsKey = key;
frameCount = 0;
}
}
上記のコードでは、プッシュボタンが押されたときに、メイン ウィンドウからグラフ ダイアログを呼び出したいと考えています。このコードを実行すると、関数でRealtimeDataGraph()
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot(QCustomPlot *)));
この行で、コンパイラは互換性のない送信側受信側を示しています。
データタイマーがタイムアウトすると、グラフダイアログが信号を受信する必要があると思います。それが受け入れられるかどうか、私には理解できません。誰かこのコードを見直して、スロットを呼び出す方法を教えてくださいrealtimeDataSlot()
。