动态QImage,未指定初始大小时

时间:2012-06-07 10:43:49

标签: qt paint qt4.8

我正在尝试使用QPainter将项目绘制到QImage上,但由于我无法预测此QImage的确切大小,我无法使用QImage :: save(),它总是告诉我:

QPainter::begin: Paint device returned engine == 0, type: 3

但是,如果我在声明此QImage时指定图像的高度和宽度,它会顺利运行:

QImage output = QImage (500 , 500 , QImage::Format_ARGB32);

2 个答案:

答案 0 :(得分:2)

QImageQPixmap等需要在绘制开始之前分配数据。使用QImage的默认构造函数不会分配任何内存,因此image.isNull() == true。因此,当您调用QPainter::begin()(可能是通过创建一个QImage作为绘图设备间接调用时),它无法绘制到任何内存中,因为它不存在。

来自QPainter::begin()文档:

QPixmap image(0, 0);
painter->begin(&image); // impossible - image.isNull() == true;

所以你必须在绘画之前想出一个尺寸。在您的情况下,最好的办法是确定最大尺寸(或者如果可行的话计算一个尺寸),然后一旦知道确切的尺寸 - 裁剪图像。

答案 1 :(得分:0)

或者,您可以在QGraphicsScene上绘制,当您在其上添加项目时会自动展开,然后只保存QGraphicsScene::itemsBoundingRect()给出的绘制区域:

QGraphicsScene scene;
scene.addItem(...);

QImage image(scene.itemsBoundingRect().size(), QImage::Format_ARGB32);

QPainter painter(&image);
scene.render(&painter, image.rect(), scene.itemsBoundingRect());