如何从 QGraphicsScene/QGraphicsView 创建图像文件?

Posted

技术标签:

【中文标题】如何从 QGraphicsScene/QGraphicsView 创建图像文件?【英文标题】:How to create image file from QGraphicsScene/QGraphicsView? 【发布时间】:2011-11-19 01:17:21 【问题描述】:

给定QGraphicsSceneQGraphicsView,是否可以创建图像文件(最好是PNG 或JPG)?如果是,怎么做?

【问题讨论】:

【参考方案1】:

在刚刚处理完这个问题之后,这里有足够的改进来保证一个新的答案:

scene->clearSelection();                                                  // Selections would also render to the file
scene->setSceneRect(scene->itemsBoundingRect());                          // Re-shrink the scene to it's bounding contents
QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32);  // Create the image with the exact size of the shrunk scene
image.fill(Qt::transparent);                                              // Start all pixels transparent

QPainter painter(&image);
scene->render(&painter);
image.save("file_name.png");

【讨论】:

【参考方案2】:

我还没有尝试过,但这是如何做到这一点的想法。

您可以通过多种方式做到这一点 一种形式如下:

QGraphicsView* view = new QGraphicsView(scene,this);
QString fileName = "file_name.png";
QPixmap pixMap = view->grab(view->sceneRect().toRect());
pixMap.save(fileName);
//Uses QWidget::grab function to create a pixmap and paints the QGraphicsView inside it. 

另一种是使用渲染函数QGraphicsScene::render():

QImage image(fn);
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
image.save("file_name.png")

【讨论】:

太棒了!谢谢。我尝试了第二种方法。唯一需要的是 QImage 需要初始化。【参考方案3】:

grabWidget 已弃用,请使用抓取。你可以使用 QFileDialog

QString fileName= QFileDialog::getSaveFileName(this, "Save image", QCoreApplication::applicationDirPath(), "BMP Files (*.bmp);;JPEG (*.JPEG);;PNG (*.png)" );
    if (!fileName.isNull())
    
        QPixmap pixMap = this->ui->graphicsView->grab();
        pixMap.save(fileName);
    

【讨论】:

我测试了您的解决方案和 Petrucio 解决方案。两者都有效,非常感谢。我更喜欢你的解决方案:),更短。

以上是关于如何从 QGraphicsScene/QGraphicsView 创建图像文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?