QObject::connect
ラムダ関数を 3 番目のパラメーターとして渡して呼び出そうとしています。
ただし、Visual Studio で次のエラーが表示されます。
QCustomPlotInVS_FirstTry.exe の 0x0000000066B48265 (Qt5Cored.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x0000000000000008。
エラーが発生したときのコール スタックの上位 3 行を次に示します。
Qt5Cored.dll!QListData::size() 91
行目 QCustomPlotInVS_FirstTry.exe!QList::size() 132 行目 QCustomPlotInVS_FirstTry.exe!QCustomPlot::graph(int index) 9657 行目
qList.h の 91 行目は次のとおりです。
inline int size() const { return d->end - d->begin; }
QCustomPlot* plot
ラムダ関数でポインター (つまり ) を誤って使用しようとしているため、このエラーが発生していると思います 。
ラムダ関数の構文は正しいですか? そうでない場合、私は何を間違っていますか?
QObject::connect
ラムダ関数で を呼び出す関数は次のとおりです。
void setupRealTimePlot(QCustomPlot* plot, QTimer* dataTimer)
{
plot->addGraph(); // blue line
plot->graph(0)->setPen(QPen(Qt::blue));
plot->graph(0)->setBrush(QBrush(QColor(240, 255, 200)));
plot->graph(0)->setAntialiasedFill(false);
plot->addGraph(); // red line
plot->graph(1)->setPen(QPen(Qt::red));
plot->graph(0)->setChannelFillGraph(plot->graph(1));
plot->addGraph(); // blue dot
plot->graph(2)->setPen(QPen(Qt::blue));
plot->graph(2)->setLineStyle(QCPGraph::lsNone);
plot->graph(2)->setScatterStyle(QCPScatterStyle::ssDisc);
plot->addGraph(); // red dot
plot->graph(3)->setPen(QPen(Qt::red));
plot->graph(3)->setLineStyle(QCPGraph::lsNone);
plot->graph(3)->setScatterStyle(QCPScatterStyle::ssDisc);
plot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
plot->xAxis->setDateTimeFormat("hh:mm:ss");
plot->xAxis->setAutoTickStep(false);
plot->xAxis->setTickStep(2);
plot->axisRect()->setupFullAxesBox();
// make left and bottom axes transfer their ranges to right and top axes:
QObject::connect(plot->xAxis, SIGNAL(rangeChanged(QCPRange)), plot->xAxis2, SLOT(setRange(QCPRange)));
QObject::connect(plot->yAxis, SIGNAL(rangeChanged(QCPRange)), plot->yAxis2, SLOT(setRange(QCPRange)));
// setup a timer that repeatedly calls MainWindow::realtimeDataSlot:
QObject::connect(dataTimer, &QTimer::timeout,
[&]()
{
// calculate two new data points:
double key = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
static double lastPointKey = 0;
if (key-lastPointKey > 0.01) // at most add point every 10 ms
{
double value0 = qSin(key); //qSin(key*1.6+qCos(key*1.7)*2)*10 + qSin(key*1.2+0.56)*20 + 26;
double value1 = qCos(key); //qSin(key*1.3+qCos(key*1.2)*1.2)*7 + qSin(key*0.9+0.26)*24 + 26;
// add data to lines:
plot->graph(0)->addData(key, value0);
plot->graph(1)->addData(key, value1);
// set data of dots:
plot->graph(2)->clearData();
plot->graph(2)->addData(key, value0);
plot->graph(3)->clearData();
plot->graph(3)->addData(key, value1);
// remove data of lines that's outside visible range:
plot->graph(0)->removeDataBefore(key-8);
plot->graph(1)->removeDataBefore(key-8);
// rescale value (vertical) axis to fit the current data:
plot->graph(0)->rescaleValueAxis();
plot->graph(1)->rescaleValueAxis(true);
lastPointKey = key;
}
// make key axis range scroll with the data (at a constant range size of 8):
plot->xAxis->setRange(key+0.25, 8, Qt::AlignRight);
plot->replot();
// calculate frames per second:
static double lastFpsKey;
static int frameCount;
++frameCount;
if (key-lastFpsKey > 2) // average fps over 2 seconds
{
lastFpsKey = key;
frameCount = 0;
}
});
dataTimer->start(0); // Interval 0 means to refresh as fast as possible
}