C++ Can';使用QLineSeries和openGL时,请不要将QChartView正确保存为图像

C++ Can';使用QLineSeries和openGL时,请不要将QChartView正确保存为图像,c++,qt,opengl,qchart,C++,Qt,Opengl,Qchart,我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用OpenGl对我来说很重要)。我使用QChartView、QChart和QLineSeries。同样对于QLineSeries我打开了使用openGL。但当我试图将图表保存为图像时,我得到的是没有数据的绘图。我知道当使用openGLQLineSeries时,它会在图表绘图区域的顶部创建一个QOpenGLWidget,但我不知道如何访问它 所以有一个问题是:如何将图表保存为带有绘制线的图像 一些图片: 我想要的(不使用openGL打印):

我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用OpenGl对我来说很重要)。我使用
QChartView
QChart
QLineSeries
。同样对于
QLineSeries
我打开了使用openGL。但当我试图将图表保存为图像时,我得到的是没有数据的绘图。我知道当使用openGL
QLineSeries
时,它会在图表绘图区域的顶部创建一个
QOpenGLWidget
,但我不知道如何访问它

所以有一个问题是:如何将图表保存为带有绘制线的图像

一些图片:

我想要的(不使用openGL打印):

我得到的(使用openGL绘图):

下面是一个代码示例:

主窗口构造函数:

chartView = new QChartView(generate_sin_chart(), ui->centralWidget);
ui->centralWidget->layout()->addWidget(chartView);
生成图表():

根据报告:

使用OpenGL: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");
QPixmap p=chartView->grab();
QOpenGLWidget*glWidget=chartView->findChild();
if(glWidget){
油漆工(p&p);
QPoint d=glWidget->mapToGlobal(QPoint())-chartView.mapToGlobal(QPoint());
painter.setCompositionMode(QPainter::CompositionMode_SourceTop);
drawImage(d,glWidget->grabFramebuffer());
结束();
}
p、 保存(“测试”、“PNG”);
由于您应该使用
QOpenGLWidget
,因此必须将
QT+=opengl
添加到.pro中


下面是一个完整的例子,我遇到了完全相同的问题。您可以通过禁用QChart的动画来解决此问题

QString filename = QFileDialog::getSaveFileName(this, tr("Save file"), "", tr("Images (*.png)"));
QPixmap p = chartView->grab();
p.save(filename, "PNG");
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");