在不在主线程中的循环中使用QPainter和QImage

时间:2015-06-12 11:29:05

标签: qt qpainter qimage

通过这个简单的循环:

for(int i=0;i<levels;i++)
{
    QImage stub(QSize(w,h),QImage::Format_RGB888);

    QPainter painter(&stub);
    painter.setFont(QFont("Monospace",8));
    painter.setPen(Qt::magenta);
    painter.drawText(stub.rect(),
                     Qt::AlignVCenter|Qt::AlignCenter,
                     QString("LAYER-%1").arg(i));

    stub.save(QString("layer%1.jpg").arg(i),"JPG");
}

我得到了一个有趣的结果:

layer0 layer1 layer3

请注意图像上打印的图层编号。 这看起来像一些缓冲问题。我还要提一下,这个循环不在主线程中运行。 如何同步QPaitner和QImage保存?

1 个答案:

答案 0 :(得分:5)

好的这个好错误。

您正在使用未初始化的QImage

http://doc.qt.io/qt-4.8/qimage.html#QImage-2

  

警告:这将使用未初始化的数据创建 QImage 。调用fill()以使用适当的像素值填充图像   用 QPainter 绘制到它上面。

因此,在每次迭代中,同一块内存被分配给QImage,之前由QImage拥有。你运气不好,在第一次迭代中你有一些清晰的内存而不是一些垃圾值。

调用填充方法来解决此问题。