我正在尝试使用 QPainter 将项目绘制到 QImage 上,但由于我无法预测此 QImage 的确切大小,因此我无法使用 QImage::save() ,它总是告诉我:
QPainter::begin: Paint device returned engine == 0, type: 3
但是如果我在声明这个 QImage 时指定图像的高度和宽度,它会顺利运行:
QImage output = QImage (500 , 500 , QImage::Format_ARGB32);
QImage
, QPixmap
, 等需要在绘图开始之前分配数据。使用默认构造函数QImage
不会分配任何内存,所以image.isNull() == true
. 因此,当您调用时QPainter::begin()
(可能通过创建一个QImage
作为绘图设备的间接调用),它无法绘制到任何内存中,因为它不存在。
从QPainter::begin()
文档:
QPixmap image(0, 0);
painter->begin(&image); // impossible - image.isNull() == true;
所以你必须在绘制之前想出一个尺寸。在您的情况下,最好的办法是确定最大尺寸(或在可行的情况下计算一个),然后在您知道确切尺寸后 - 裁剪图像。
或者,您可以在 a 上绘制,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());