在使用QLineSeries时打开openGL,无法正确保存QChartView作为图像

0vvn1miw  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(213)

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

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

一些图片:
我想要的(不使用OpenGL绘图):

我得到了什么(用OpenGL绘图):

下面是一个代码示例:
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");
cpjpxq1n

cpjpxq1n1#

根据文档:

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中找到

63lcw9qa

63lcw9qa2#

我也遇到了同样的问题。您可以通过禁用QChart的动画来解决它。

相关问题