qt — QtChart — сохранение графика, который не отображался

Я пытаюсь сохранить диаграмму в файл, в 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 перед его сохранением и т. Д., Но не смог получить хороший результат.

1

Решение

Я использую следующий код для визуализации 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);

}
0

Другие решения

Я не нашел простого пути к этому, поэтому вот мое решение, которое больше похоже на обходной путь:

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 мс.

0

По вопросам рекламы [email protected]