首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用带有QChartView的QLineSeries时,无法正确地将openGL保存为图像

在使用带有QChartView的QLineSeries时,无法正确地将openGL保存为图像
EN

Stack Overflow用户
提问于 2018-01-07 17:27:02
回答 2查看 3.5K关注 0票数 3

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

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

一些图片:

我想要的(不使用openGL的情节):

我得到了什么(与openGL的情节):

下面是一个代码示例:

MainWindow构造函数:

代码语言:javascript
复制
chartView = new QChartView(generate_sin_chart(), ui->centralWidget);
ui->centralWidget->layout()->addWidget(chartView);

generate_sin_chart():

代码语言:javascript
复制
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;

储蓄功能:

代码语言:javascript
复制
QString filename = QFileDialog::getSaveFileName(this, tr("Save file"), "", tr("Images (*.png)"));
QPixmap p = chartView->grab();
p.save(filename, "PNG");
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-07 21:28:26

根据文档

useOpenGL : bool 指定是否使用OpenGL加速绘制系列。 使用OpenGL加速只支持QLineSeries和QScatterSeries。用作QAreaSeries边缘序列的线系列不能使用OpenGL加速。当图表包含用OpenGL绘制的任何系列时,将在图表绘图区域的顶部创建透明的QOpenGLWidget。加速系列不是在基础QGraphicsView上绘制的,而是在创建的QOpenGLWidget上绘制的。 ..。

因此,当您使用grab()只拍摄QChartView的照片时,解决方案是找到QOpenGLWidget对象并将其图像记录在QChartView图像之上,下面的代码可以做到这一点:

代码语言:javascript
复制
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中

在下面的链接中可以找到完整的示例

票数 5
EN

Stack Overflow用户

发布于 2020-08-25 12:54:22

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48139716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档