2

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

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

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

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

4

2 回答 2

2

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

QPainter::begin()文档:

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

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

于 2012-06-07T11:14:01.027 回答
0

或者,您可以在 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());
于 2012-06-07T13:30:23.517 回答