为什么我的QChart变得越来越慢,我增加了一个系列图表动态图表

2022-01-30 15:10:06 标签 c++qtqt5qtcharts

我试图通过使用QT的内部图表库在QT中创建一个动态图表。

它工作得很好,但我面临的问题是,我在图表中添加的越多,它就变得越慢。

假设我想在我的图表中显示30个点。这意味着我添加一个点,移除第一个点。

假设我们想要播放8部电视剧。所以我开始在图表中创建我的系列。

// This is a private field 
QList<QList<float>*> pwm_holder;
// This is the constructor 
Easy_chart::Easy_chart(){
    for(int i = 0; i < 8; i++)
        pwm_holder.append(new QList<float>());

然后我设置要在图表中显示多少个样本。

void Easy_chart::set_show_samples(int show_samples){
    this->show_samples = show_samples; // show_samples is a integer private field
}

然后我设置了我的ChartView,这样我就可以在UI上看到我的图表。这里QChart QChart;也是一个私有字段。我没有这个作为指针,因为每个ChartView只有一个图表。

void Easy_chart::set_chart_view(QChartView* qChartView){
    qChartView->setChart(&qChart);
}

在我将数据纳入我的系列之前。我需要先调用这个函数。这个函数从图表中删除所有的系列,比如pwm_serie。还pwm_serie。clear ();是非常有用的,因为即使所有QLineSeries从pwm_serie中移除,pwm_serie仍然有计数索引,所以清除pwm_serie后,我们再次从索引0开始。

void Easy_chart::create_new_series(){
    qChart.removeAllSeries();
    pwm_serie.clear();
    for(int i = 0; i < 8; i++)
        pwm_serie.append(new QLineSeries()); 

假设我想添加一个值到PWM系列2,然后我使用这段代码。

void Easy_chart::append_to_pwm_serie(int index, uint16_t value){
    qChart.addSeries(append_to_series("PWM", pwm_serie.at(index), pwm_holder.at(index), index, value));
}

我用append_to_pwm_serie(2 143)调用函数;将143号添加到pwm_serie 2。

函数append_to_series所做的是,它设置了serie的标签,并填充了一个holder。

所以现在意甲是空的,但是我们正在用holder来填补它。然后我们用holder填充serie。否则,我们无法在图表中显示值。您不能向序列添加一个值,并假定图表将更新并显示它。

QLineSeries* Easy_chart::append_to_series(const QString& label, QLineSeries* serie, QList<float>* holder, int index, float value){
    /* Set the name of the serie + the last value */
    serie->setName(label + QString::number(index) + "(" + QString::number(value) + ")");
    /* Fill the holder */
    int count = holder->length();
    if(count >= show_samples){
        // Shift 1 step backwards
        for(int i = 0; i < count; i++)
            if(i < count - 1)
                holder->replace(i, holder->at(i+1));
            else
                holder->replace(i, value);
    }else{
        holder->append(value);
    }
    /* Copy over holder to the empty serie */
    count = holder->length();
    for(int i = 0; i < count; i++)
        serie->append(i, holder->at(i));
    return serie;
}

要用一个值更新一个serie,你需要做以下事情:

将级数从图表中删除

清除该系列的索引

填满临时支架,根据需要调整临时支架的长度。

将临时持有人复制到该系列

将级数添加到图表中

和6。为图表提供默认轴。现在我可以看到图表了。您不能先添加图表,然后再添加级数。不工作。系列总是最后出现,您不能对添加到图表的系列进行追加。不是这样的。

void Easy_chart::add_default_axex_to_chart(){
    qChart.createDefaultAxes();
}

如果你有所有的数据,只是想直接填充序列,那么你不需要一个临时持有人。

问题:

这个示例运行得非常好。但问题是,过了一段时间(比如4分钟),这个图表就会变得很重,CPU会因为这个图表的内存消耗而以最高速度运行。

有没有更好的方法或者我忘记了什么导致内存消耗的东西?

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码