Не удается правильно сохранить QChartView как изображение при использовании QLineSeries с openGL на

я пытаюсь создать приложение, которое может отображать большие наборы данных (поэтому использование OpenGl важно для меня). я использую QChartView, QChart а также QLineSeries, Также для QLineSeries Я включаю, используя OpenGL. Но когда я пытаюсь сохранить график как изображение, я получаю график без данных. Я знаю что когда QLineSeries используя openGL, он создает QOpenGLWidget в верхней части области графика, но я не знаю, как получить к ней доступ.

Так что вопрос: как сохранить график как изображение с нарисованными линиями?

Некоторые изображения:

Что я хочу (участок без использования openGL):

Участок без использования openGL

Что я получаю (Сюжет с 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");

2

Решение

Согласно документы:

useOpenGL: bool

Указывает, ускоряется ли отрисовка серии с помощью OpenGL.

Ускорение с использованием OpenGL поддерживается только для QLineSeries и QScatterSeries. Ряд линий, используемый как ряд ребер для QAreaSeries, не может использовать ускорение OpenGL. Когда диаграмма содержит какие-либо серии, нарисованные с помощью OpenGL, поверх области графика диаграммы создается прозрачный QOpenGLWidget. Ускоренные серии не рисуются в базовом QGraphicsView, а вместо этого рисуются в созданном QOpenGLWidget.

[…]

Поэтому, когда вы используете grab() только сфотографировать QChartViewрешение состоит в том, чтобы найти QOpenGLWidget объект и запишите его изображение на вершине QChartView image, следующий код делает это:

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

Полный пример можно найти в следующем ссылка на сайт

1

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

Других решений пока нет …

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