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

3

问题

我正在使用Qt LineChart,这个QLineChart可以在CPU渲染时加载和删除数据,没有问题。但是,在使用setUseOpenGL(true)时,QChart removeSeries()不能正确更新我的QLineChart。已经删除的数据仍然可见于QChart。奇怪的是,当鼠标悬停于QChart上时,QChart会被更新并且数据被删除。

期望结果

调用removeSeries()后更新QChart。

观察结果

QChart没有被更新。

尝试过的解决方法

  1. 调用ChartView的repaint() -- 没有效果
  2. 发射自定义的QEvent以模拟鼠标悬停在QChart上 -- 没有效果
  3. 将包含QChartView的Widget设置为FullViewportUpdate -- 没有效果

我已经想不到更多的解决方法了,欢迎提出所有建议。相关代码:

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;

我已经检查了这个问题,现在我有一个暂时的解决方案,虽然不是非常优雅,但可以用来推进,我注意到当你调整图像大小时图表会被更新,那么这是一段可以帮助你的代码:chartView->resize(chartView->size() + QSize(1, 1)); chartView->resize(chartView->size() - QSize(1, 1));,我会继续寻找更好的解决方案。 - eyllanesc
非常感谢,这确实解决了问题! - Thomas V
1个回答

2

我已经检查了这个问题,现在我有一个临时的解决方案,虽然不太优雅,但可能有所帮助。我注意到当你调整图表大小时,图表会更新,那么这是一个可以帮助你的代码:

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

我会继续寻找更好的解决方案。
示例:
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接