我正在尝试使用QPainter将项目绘制到QImage上,但由于我无法预测此QImage的确切大小,我无法使用QImage :: save(),它总是告诉我:
QPainter::begin: Paint device returned engine == 0, type: 3
但是,如果我在声明此QImage时指定图像的高度和宽度,它会顺利运行:
QImage output = QImage (500 , 500 , QImage::Format_ARGB32);
答案 0 :(得分:2)
QImage
,QPixmap
等需要在绘制开始之前分配数据。使用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());