После добавления некоторых точек в QtChart он замедляется

Мне нужна помощь. Вот мой код (я показываю основную часть):

// 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 (я использую их в проекте) или точки добавления в серию. Пожалуйста, помогите мне(

0 ответов

Это старая тема - однако я также столкнулся с ней при работе с QtCharts - так что: для тех, кто наткнется на те же проблемы с QtCharts и также хотел бы использовать QtCharts, вот мои решения:

Используйте OpenGL:

  • вызовите setUseOpenGL(true) для серии в графике (будет работать только с QLineSeries и QScatterSeries) - к сожалению, это не по умолчанию, но это может быть проблемой в некоторых системах

Когда не используется OpenGL (т.е. также используется QAreaSeries):

И вот особый трюк, который придумал коллега при работе с данными в реальном времени:

  • установить для всех серий значение signalBlocked(true), запустить таймер при блокировке, разблокировать через секунду, снова заблокировать и запустить таймер при повторном добавлении новых данных - это будет обновлять графики каждые (примерно) каждую секунду, но влияние на производительность невелико
Другие вопросы по тегам