我需要帮助。这是我的代码(我显示主要部分):
// Arduino Reader
serial.setPortName("/dev/ttyACM0");
serial.open(QIODevice::ReadWrite);
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
connect(&serial,SIGNAL(readyRead()),this,SLOT(getNewData()));
。
void MainWindow::getNewData()
{
std::clock_t starter = std::clock();
QByteArray data = serial.readAll();
QDataStream in(serial.readAll());
getData = getData + data;
int start = getData.indexOf(":START:");
int end = getData.indexOf(":END:",start);
QString nowWork = getData.mid(start,end-start+5);
if (nowWork.startsWith(":START:") && nowWork.endsWith(":END:")){
QStringList mod = nowWork.remove(":START:").remove(":END:").split(":");
int xPoint = mod[0].toInt();
int yPoint = mod[1].toInt();
int zPoint = mod[2].toInt();
int aPoint = mod[3].toInt();
int bPoint = mod[4].toInt();
int cPoint = mod[5].toInt();
addQuery(1,xPoint,yPoint,zPoint);
addQuery(2,aPoint,bPoint,cPoint);
getData = getData.right(end+5);
}
std::clock_t ender = std::clock();
ui->ping->setText(QString::number( (ender-starter)/ (double)CLOCKS_PER_SEC *100));
return;
}
。
void MainWindow::addQuery(int to, int x, int y, int z){
seriesAllD1->append(now, (x+y+z)/3 );
seriesXD1->append(now,x);
seriesYD1->append(now,y);
seriesZD1->append(now,z);
seriesAllD1->remove(0);
seriesXD1->remove(0);
seriesYD1->remove(0);
seriesZD1->remove(0);
chartAllD1->axisX()->setRange(now-100,now);
chartX->axisX()->setRange(now-100,now);
chartY->axisX()->setRange(now-100,now);
chartZ->axisX()->setRange(now-100,now);
now++;
return;
}
我尝试描述代码: 1)它从arduino获取数据(如":START:X:Y:Z:A:B:C:END::START:...")。 2) 它从 2 个传感器(3 轴加速度器)获取指示。并绘制图形。
我展示了一些代码块。添加 ~900 点后,它从 60 毫秒到 1000 毫秒变慢。我认为它与QtChart有关(我在项目中使用它们)或向系列添加点。请帮助我(
这是一个古老的话题 - 但是我在使用QtCharts时也遇到了它 - 所以:对于其他会偶然发现QtCharts相同问题并且也想使用QtCharts的人,这是我的解决方案:
使用 OpenGL:
- 在图中的序列上调用setUseOpenGL(true)(仅适用于QLineSeries和QScatterSeries) - 不幸的是,这不是默认值,但在某些系统上可能是问题
不使用 OpenGL 时(即也使用 QAreaSeries):
- 不使用抗锯齿
- 在一个循环中将大量数据添加到序列中使用而不是替换而不是添加 - 请参阅 https://stackoverflow.com/a/52334549/2056545
一位同事在处理实时数据时想出了这个特殊的技巧:
- 将所有系列设置为 signalsBlocked(true),阻塞时启动计时器,一秒后取消阻塞,再次阻塞并在再次添加新数据时启动计时器 - 这将每秒更新一次图(大约),但性能影响很小