首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT应用程序中的QChart减慢

QT应用程序中的QChart减慢
EN

Stack Overflow用户
提问于 2019-08-28 13:05:29
回答 1查看 1.4K关注 0票数 0

因此,我编写了一个QT应用程序,该应用程序将从串行端口读取值,并在运行时在图形中显示它们。我设法在运行时用一个随机生成的值更新了我的QChart,以尝试实时更新,一切都很好。

,但是我的应用程序越多,速度就越慢,直到它完全无法使用为止。

我确实理解包含我观点的列表在增长,但是在100点左右之后,它真的真的慢下来了,真的很快,感觉好像我有某种记忆泄漏?

我知道通常的答案是“不要使用QCharts”,但是我在C++和QT方面都是初学者,所以这就是我为了简单而使用的方法。

MainWindow.cpp

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QGridLayout>

#include <QLabel>
#include <QDebug>

QT_CHARTS_USE_NAMESPACE
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    series = new QLineSeries();

    chart = new QChart();
    chart->legend()->hide();
    chart->addSeries(series);
    chart->createDefaultAxes();
    chart->axes(Qt::Vertical).back()->setRange(-10, 10);
    chart->axes(Qt::Horizontal).back()->setRange(0, 100);

    chart->setContentsMargins(0, 0, 0, 0);
    chart->setBackgroundRoundness(0);

    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    ui->setupUi(this);

    QLabel *label = new QLabel();
    label->setText("Hello World");

    QGridLayout *layout = new QGridLayout;
    QWidget * central = new QWidget();
    setCentralWidget(central);
    centralWidget()->setLayout(layout);

    layout->addWidget(chartView, 0, 0);

    clock = 0;

    SerialPortReader *reader = new SerialPortReader(this);

    connect(reader, SIGNAL(onReadValue(int)), this, SLOT(onReadValue(int)));

    reader->run();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onReadValue(int value){
    ++clock;    
    series->append(clock + 30, value);
    chart->axes(Qt::Horizontal).back()->setRange(0 + clock, 100 + clock);    
}

SerialPortReader.cpp

代码语言:javascript
复制
#include "serialportreader.h"
#include "mainwindow.h"
#include <QtCore>
#include <QRandomGenerator>
#include <QDebug>

SerialPortReader::SerialPortReader(QObject *parent) : QThread(parent)
{
    this->parent = parent;
    this->randomGenerator = QRandomGenerator::global();
}

void SerialPortReader::run() {

    QTimer *timer = new QTimer(this);
    timer->start(100);
    connect(timer, SIGNAL(timeout()), this, SLOT(readValue()));
}

void SerialPortReader::readValue() {
    int value = randomGenerator->bounded(-10, 10);
    emit onReadValue(value);
}

我只是想知道是否有人对什么可能出了问题有任何建议?或者有什么我能做的,除了改变图表库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-28 17:00:52

在修补了一下之后,我发现罪魁祸首其实不是内存泄漏,而是:

代码语言:javascript
复制
chartView->setRenderHint(QPainter::Antialiasing);

随着越来越多的数据被提交,它需要做所有的反混叠缓慢。

当我把它移开的时候,一切突然变得非常顺利。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57693139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档