Qt setUseOpenGL(true) 和 removeSeries() 不更新 QChart
Qt setUseOpenGL(true) and removeSeries() do not update QChart
问题
我正在使用 Qt LineChart,此 QLineChart 可以在 CPU 渲染时毫无问题地加载和删除数据。但是,QChart removeSeries() 在使用 setUseOpenGL(true) 时不会正确更新我的 QLineChart。删除的数据在 QChart 上仍然可见。奇怪的是,当鼠标悬停在QChart上时,QChart被更新,数据被删除。
预期结果
调用 removeSeries() 后更新 QChart。
观测结果
QChart 未更新。
我试过的
- 调用 ChartView repaint() -- 无效
- 发出自定义 QEvent 以模拟鼠标悬停在 QChart 上 -- 无效
- 将包含 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));
我会继续寻找更好的解决方案
示例:
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();
}
问题
我正在使用 Qt LineChart,此 QLineChart 可以在 CPU 渲染时毫无问题地加载和删除数据。但是,QChart removeSeries() 在使用 setUseOpenGL(true) 时不会正确更新我的 QLineChart。删除的数据在 QChart 上仍然可见。奇怪的是,当鼠标悬停在QChart上时,QChart被更新,数据被删除。
预期结果
调用 removeSeries() 后更新 QChart。
观测结果
QChart 未更新。
我试过的
- 调用 ChartView repaint() -- 无效
- 发出自定义 QEvent 以模拟鼠标悬停在 QChart 上 -- 无效
- 将包含 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));
我会继续寻找更好的解决方案
示例:
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();
}