问题

我正在使用Qt LineChart,此QLineChart可以加载和删除数据,而不会影响CPU渲染。但是,使用setUseOpenGL(true)时,QChart removeSeries()无法正确更新我的QLineChart。删除的数据仍在QChart上可见。奇怪的是,将鼠标悬停在QChart上时,QChart会更新并删除数据。

预期结果

调用removeSeries()后更新QChart。

观察结果

QChart未更新。

我尝试过的

  • 调用ChartView repaint()-无效
  • 发出自定义QEvent来模拟将鼠标悬停在QChart上-无效
  • 将包含QChartView的小部件设置为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));
    

    我会继续寻找更好的解决方案

    例:
    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();
    }
    

    关于c++ - Qt setUseOpenGL(true)和removeSeries()不更新QChart,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45765620/

    10-09 13:10