【问题标题】:Can't properly save QChartView as image when using QLineSeries with openGL on使用带有 openGL 的 QLineSeries 时无法将 QChartView 正确保存为图像
【发布时间】:2018-01-07 17:27:02
【问题描述】:

我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用 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");

【问题讨论】:

    标签: c++ qt opengl qchart


    【解决方案1】:

    根据docs

    使用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");
    

    由于您应该使用QOpenGLWidget,您必须将QT += opengl 添加到您的.pro 中

    完整的例子可以在下面的link找到

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多