Search code examples
c++qtqtcharts

QtChart - C++ - Saving a chart which wasn't displayed


I'm trying to save a chart to a file, in a QTextDocument in this example :

QTextDocument doc("Frame rate test\n");
QTextCursor cursor(&doc);
cursor.movePosition(QTextCursor::End);

if (getTestFinishedStatus())
{
    QPixmap pix = _pFrameRateChart->grab(); //_pFrameRateChart is QChartView
    cursor.insertImage(pix.toImage());
}

QTextDocumentWriter docWriter;
docWriter.setFileName("framerate.odf");
docWriter.setFormat("ODF");
docWriter.write(&doc);

The problem is the result isn't same if I'm displaying the chart in an ui. Here is the result when not displayed :

enter image description here

Here is the result when displayed :

enter image description here

Obviously I would like to have the second result even when I don't add the ChartView to a widget to display it on an ui. I've tried resizing the QChartView, resizing the QChart, adding the Chart to a temporarly widget and QVBoxLayout then saving it, showing temporarly the QChartView before saving it etc... but didn't managed to get a good result.


Solution

  • I didn't find any easy way to this, so here's my solution, which is more like a workaround though :

    QPixmap ChartView::getChartPixmap()
    {
        QWidget* w = new QWidget; //creating a temporary widget, which will enable to display the chart
    
        w->resize(REPORT_IMAGE_WIDTH, REPORT_IMAGE_HEIGHT);
        QVBoxLayout *vl;
        vl = new QVBoxLayout(w);
        vl->addWidget(this); //'this' being the QChartView
    
        w->show(); //showing the widget so it is resized and can be grabbed with the correct dimensions
    
        QTest::qWait(500); //we need to wait for a little for the graph to be drawn otherwise you'll still have the same size problem
    
        QPixmap pixmap = w->grab(); //retrieve the pixmap
    
        w->hide(); //hiding the widget
    
        return pixmap;
    }
    

    It's working but you'll have a small window opened with the graph for 500 ms.