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;
4

1 回答 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();
}
于 2017-08-18T23:49:37.223 回答