如何在 QWidget 中获取 QtDataVizualisation 的 QPixmap 并保存到文件?

Posted

技术标签:

【中文标题】如何在 QWidget 中获取 QtDataVizualisation 的 QPixmap 并保存到文件?【英文标题】:How do I grab a QPixmap of a QtDataVizualisation in a QWidget and save to file? 【发布时间】:2019-08-08 15:08:59 【问题描述】:

我正在尝试使用 QtDataVisualizationQ3DScatter 制作一个 3D 散点图,然后获取一个 QPixmap 并保存到文件中。

这是我的代码。

    //set up the 3D scatter chart
    QtDataVisualization::Q3DScatter *graph = new QtDataVisualization::Q3DScatter();
    QWidget *widget = QWidget::createWindowContainer(graph);
    QtDataVisualization::QScatter3DSeries *series = new QtDataVisualization::QScatter3DSeries;

    //set up the data variable
    QtDataVisualization::QScatterDataArray data;

    //add data to the data variable
    for (int i; i < nodes.size(); i = i + 1)
    
        data << QVector3D(x[i], y[i], z[i]);
    

    //add the data to series
    series->dataProxy()->addItems(data);

    //add series to graph
    graph->addSeries(series);

    //set the graph properties
    graph->activeTheme()->setType(QtDataVisualization::Q3DTheme::ThemeArmyBlue);
    graph->scene()->activeCamera()->setCameraPreset(QtDataVisualization::Q3DCamera::CameraPresetIsometricRight);
    graph->seriesList().at(0)->setMesh(QtDataVisualization::QAbstract3DSeries::MeshPoint);
    graph->setShadowQuality(QtDataVisualization::QAbstract3DGraph::ShadowQuality(0));

    //widget->show();
    const QRect rectangle(0,0,widget->width(),widget->height());
    QPixmap test = widget->grab(rectangle);
    test.save(QString(workingDirectory) + "/test.png", "PNG");

当我取消注释“widget->show()”时,test.png 只是一个白色方块,但小部件出现并显示完整的 3DScatter。当我注释掉“widget->show()”时,test.png 仍然只是一个白色方块。我似乎无法让它工作。

【问题讨论】:

nodesxyz 是什么? 【参考方案1】:

评论widget-&gt;show() 时,添加widget-&gt;repaint() 调用以强制在将小部件保存到文件之前对其进行绘制/渲染。

【讨论】:

这仍然没有做任何事情。我仍然得到一个白盒子:/感谢您的尝试【参考方案2】:

我意识到这个问题已经很老了,但对于任何有兴趣的人来说:

QAbstract3DGraph 有一个函数 renderToImage。这是由 Q3DScatter 继承的。

您应该能够使用以下方法获取场景的 qimage:

QImage myImage = graph->renderToImage();

然后将其转换为像素图:

QPixmap p;
p.convertFromImage(myImage);

【讨论】:

以上是关于如何在 QWidget 中获取 QtDataVizualisation 的 QPixmap 并保存到文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qwidget 中添加视频播放器? [复制]

如何从打开的窗口列表中检索 QWidget

如何获取 qpushbutton 上的文本?

获取 QWidget 初始大小的可靠方法

QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

QT中按钮如何布局?