我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用OpenGl对我很重要)。我使用QChartView
,QChart
和QLineSeries
。同样对于QLineSeries
我使用openGL打开。但是当我试图将图表保存为图像时,我会得到没有数据的图表。我知道当QLineSeries
使用openGL时,它会在图表绘图区域的顶部创建一个QOpenGLWidget
,但我不知道如何访问它。
所以问题是:如何将图表保存为带有绘制线条的图像?
一些图片:
我想要什么(不使用openGL绘图):
我得到了什么(使用openGL绘图):
{{3}}
以下是代码示例:
MainWindow构造函数:
chartView = new QChartView(generate_sin_chart(), ui->centralWidget);
ui->centralWidget->layout()->addWidget(chartView);
generate_sin_chart():
QLineSeries *series = new QLineSeries();
series->setUseOpenGL(true); //this line cause a problem
constexpr double PI = 3.14159265359;
for(int i = 0; i < 100; ++i)
{
double temp = i*PI/6;
series->append(temp, sin(temp));
}
QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle("Simple line chart example");
return chart;
保存功能:
QString filename = QFileDialog::getSaveFileName(this, tr("Save file"), "", tr("Images (*.png)"));
QPixmap p = chartView->grab();
p.save(filename, "PNG");
答案 0 :(得分:1)
根据docs:
useOpenGL:bool
指定是否使用OpenGL加速绘制系列。
仅QLineSeries和QScatterSeries支持使用OpenGL加速。用作QAreaSeries边缘系列的线系列不能使用OpenGL加速。当图表包含使用OpenGL绘制的任何系列时,会在图表绘图区域的顶部创建透明的QOpenGLWidget。加速系列不是在底层QGraphicsView上绘制的,而是在创建的QOpenGLWidget上绘制。
[...]
因此,当您使用grab()
时,只需拍摄QChartView
的照片,解决方法是找到QOpenGLWidget
对象并将其图像记录在QChartView
图像的顶部,以下代码执行:
QPixmap p = chartView->grab();
QOpenGLWidget *glWidget = chartView->findChild<QOpenGLWidget*>();
if(glWidget){
QPainter painter(&p);
QPoint d = glWidget->mapToGlobal(QPoint())-chartView.mapToGlobal(QPoint());
painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
painter.drawImage(d, glWidget->grabFramebuffer());
painter.end();
}
p.save("test", "PNG");
由于您应该使用QOpenGLWidget
,因此必须将QT += opengl
添加到.pro
可以在以下link
中找到完整的示例答案 1 :(得分:0)
我遇到了完全相同的问题。您可以通过禁用QChart的动画来解决它。