简体   繁体   English

Qt setUseOpenGL(true) 和 removeSeries() 不更新 QChart

[英]Qt setUseOpenGL(true) and removeSeries() do not update QChart

The Problem问题

I'm using a Qt LineChart, this QLineChart can load and remove data without a problem on CPU rendering.我正在使用 Qt LineChart,这个 QLineChart 可以加载和删除数据,而不会出现 CPU 渲染问题。 However, QChart removeSeries() does not update my QLineChart properly when using setUseOpenGL(true).但是,在使用 setUseOpenGL(true) 时,QChart removeSeries() 不会正确更新我的 QLineChart。 The removed data is still visible on the QChart.删除的数据在 QChart 上仍然可见。 Strangely, when hovering the mouse over the QChart, the QChart is updated and data is removed.奇怪的是,当鼠标悬停在 QChart 上时,QChart 会更新并删除数据。

Expected Result预期结果

Update QChart after calling removeSeries().调用 removeSeries() 后更新 QChart。

Observed Result观察结果

QChart is not updated. QChart 未更新。

What I've tried我试过的

  1. Call ChartView repaint() -- no effect调用 ChartView repaint() -- 没有效果
  2. Emit custom QEvent to simulate mouse hover over QChart -- no effect发出自定义 QEvent 来模拟鼠标悬停在 QChart 上——无效
  3. Set Widget which contains QChartView to FullViewportUpdate -- no effect将包含 QChartView 的 Widget 设置为 FullViewportUpdate -- 无效

I'm all out of ideas.我都没有想法了。 All suggestions are welcome.欢迎提出所有建议。 Relevant code:相关代码:

QLineSeries *series3= data->getScanLineSeries();
series3->setUseOpenGL(true);
if(data->getLineSeriesOnChart() == false)
...
{
    chart->addSeries(series3);
    data->setLineSeriesOnChart(true);
    std::cout << "Series added to chart.";
    qDebug() << QString("Series added to chart");
}
else
{
    chart->removeSeries(series3);
    data->setLineSeriesOnChart(false);
    qDebug() << QString("ERROR: this series was already on the chart, removing QLineSeries");
    return chart;
}
...
(axes handling)
return chart;

I have checked the problem, and now I have a temporary solution and not very elegant, it may serve to advance, I have noticed that the chart is updated when you resize the chart, then this is a code that can help you:我查了一下问题,现在有一个临时解决方案,不是很优雅,可能有助于推进,我注意到调整图表大小时图表会更新,那么这是一个可以帮助您的代码:

chartView->resize(chartView->size() + QSize(1, 1)); 
chartView->resize(chartView->size() - QSize(1, 1));

I'll keep on looking for a better solution我会继续寻找更好的解决方案

Example:例子:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLineSeries *series = new QLineSeries();

    series->append(0, 6);
    series->append(2, 4);
    series->append(3, 8);
    series->append(7, 4);
    series->append(10, 5);
    *series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);

    series->setUseOpenGL(true);

    QChart *chart = new QChart();
    chart->legend()->hide();
    chart->addSeries(series);
    chart->createDefaultAxes();
    chart->setTitle("Simple line chart example");

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

    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [chart, series, chartView](){
        qDebug()<<chart->series();
        if(!chart->series().isEmpty())
            chart->removeSeries(series);
        else
            chart->addSeries(series);
        chartView->resize(chartView->size()+QSize(1, 1));
        chartView->resize(chartView->size()-QSize(1, 1));
    });

    timer.start(1000);

    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(400, 300);
    window.show();

    return a.exec();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM