好吧我正在尝试在许多图像绘制程序中实现类似于'撤消'功能的东西。我遇到的问题是:我正在尝试在QVector中制作QImage对象的备份副本(最多可存储10个最新的QImage副本以备份),然后尝试在另一个函数中检索这些备份。问题是备份没有正确创建(因为当我尝试恢复备份映像时,没有任何反应)。我知道问题在于备份部分,而不是在恢复部分,因为当我备份一个红色背景的新临时图像时,它恢复得很好..
这是备份功能代码:
imageBackups.append(image);
其中'image'是我正在尝试备份的QImage对象..
这是一个备用备份(存储红色背景图像) - 我用它来看看这个版本的备份是否有效,它确实如此:
QImage newImage(QSize(100,100), QImage::Format_RGB32);
newImage.fill(qRgb(255, 0, 0));
imageBackups.append(newImage);
这是恢复代码:
image =imageBackups.at(imageBackups.size()-1);
QPainter painter(&image);
painter.drawImage(QPoint(0,0),imageBackups.at(imageBackups.size()-1));
'image'的定义与上面的newImage完全相同,但在这种情况下大小为800x400 ..
答案 0 :(得分:1)
当newImage超出范围时,它开始被解构,我猜测追加是在进行某种浅层复制,它只存储对图像的引用。 QT使用一些对象进行自动引用计数,但我不记得细节
尝试使用new创建QImage并将指针存储在imageBackups中(无论如何都是一种更好的方法)。
像这样的东西(注意imageBackups现在需要是QIMage *的数组)
QImage pImage = new QImage(QSize(100,100), QImage::Format_RGB32);
pImage->fill(qRgb(255, 0, 0));
imageBackups.append(pImage);
答案 1 :(得分:0)
这可能与您创建图像的方式有关。如果您使用其中一个带有uchar *
缓冲区(const
或不带{1}}的构造函数,则必须确保缓冲区在QImage
及其副本的整个生命周期内有效:
http://doc.trolltech.com/latest/qimage.html#QImage-5
如果在从QVector
恢复图像时,缓冲区被删除,则恢复的QImage
将使用一些陈旧的内存位置作为缓冲区。
答案 2 :(得分:0)
我认为您的恢复代码可能有问题。也许从实际代码转移到问题只是一个错字,但你应该调查一下。以下是我解析恢复代码的方法。
// Get the image that is back one.
image =imageBackups.at(imageBackups.size()-1);
// Create a painter onto the backup image
QPainter painter(&image);
// Paint the backup image in the painter (onto the backup image).
painter.drawImage(QPoint(0,0),imageBackups.at(imageBackups.size()-1));
我无法看到这是如何完成任何事情的,这可以解释为什么在你恢复时似乎没有任何事情发生。