Я пытаюсь сохранить диаграмму в файл, в QTextDocument в этом примере:
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);
Проблема в том, что результат не тот, если я отображаю график в пользовательском интерфейсе.
Вот результат, когда не отображается:
Вот результат при отображении:
Очевидно, что я хотел бы получить второй результат, даже если я не добавляю ChartView в виджет, чтобы отобразить его на пользовательском интерфейсе.
Я попытался изменить размер QChartView, изменить размер QChart, добавить Chart во временный виджет и QVBoxLayout, а затем сохранить его, временно показывая QChartView перед его сохранением и т. Д., Но не смог получить хороший результат.
Я использую следующий код для визуализации QGraphivsView на Pixmap, так как QtCharts основан на QGraphivsView, я думаю, что это также будет работать.
Пробовать оказывать изображение вместо того, чтобы пытаться захватить растровое изображение.
void Printer::putProfileImage(QRect profilePlaceholder, QRect viewPort, QPainter *painter, QGraphivsView* profile)
{
int x = profilePlaceholder.x() - viewPort.x();
int y = profilePlaceholder.y() - viewPort.y();
QRect pos(x, y, profilePlaceholder.width(), profilePlaceholder.height());
profile->render(painter, pos);
}
Я не нашел простого пути к этому, поэтому вот мое решение, которое больше похоже на обходной путь:
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;
}
Это работает, но у вас будет небольшое окно с графиком в течение 500 мс.