mon*_*ber 4 c++ opengl qt qchart
我正在尝试创建一个可以绘制大型数据集的应用程序(因此使用 OpenGL 对我来说很重要)。我用QChartView,QChart和QLineSeries. 也为QLineSeries我打开使用 openGL。但是当我尝试将图表保存为图像时,我得到的绘图没有数据。我知道使用 openGL 时它会在图表绘图区域顶部QLineSeries创建一个,但我不知道如何访问它。QOpenGLWidget
那么问题是:如何将图表另存为带有绘制线条的图像?
一些图片:
我想要什么(不使用 openGL 绘图):
我得到什么(用 openGL 绘图):
这是代码示例:
主窗口构造函数:
chartView = new QChartView(generate_sin_chart(), ui->centralWidget);
ui->centralWidget->layout()->addWidget(chartView);
Run Code Online (Sandbox Code Playgroud)
生成正弦图():
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;
Run Code Online (Sandbox Code Playgroud)
保存功能:
QString filename = QFileDialog::getSaveFileName(this, tr("Save file"), "", tr("Images (*.png)"));
QPixmap p = chartView->grab();
p.save(filename, "PNG");
Run Code Online (Sandbox Code Playgroud)
根据文档:
使用OpenGL:布尔
指定是否使用 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");
Run Code Online (Sandbox Code Playgroud)
当您应该使用时,QOpenGLWidget您必须添加QT += opengl到您的 .pro
完整的示例可以在以下链接中找到