2010-06-25 79 views
2

好吧,我試圖在許多圖像繪圖程序中實現類似於「撤消」功能的東西..我遇到的問題是這樣的:我試圖讓QVector中的QImage對象的備份副本(可存儲多達10個用於備份的最新QImage副本),然後嘗試在另一個函數中檢索這些備份。問題是備份沒有正確創建(因爲當我嘗試恢復備份映像時,什麼也沒有發生)。我知道這個問題是在備份一部分,而不是在恢復部分,因爲當我備份用紅色背景的新的暫定圖像,它恢復完美的地方..難以存儲QImage,然後恢復它

這是備份功能代碼:

imageBackups.append(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)); 

「圖像」被定義酷似newImage以上,除了其是在這種情況下800x400大小..

+0

QVector可能不是存儲備份映像的最佳數據結構。 QList或QQueue可能會更好用於該用途。 – 2010-06-25 19:52:19

回答

0

它可能有事情做與你如何創建的圖像。如果您使用的是需要一個uchar *緩衝(const與否)的建設者之一,你必須確保緩衝區是有效的,通過了QImage的生活和副本:

http://doc.trolltech.com/latest/qimage.html#QImage-5

如果在從QVector恢復圖像的時間,緩衝區被刪除,恢復的QImage將使用一些陳舊的內存位置作爲它的緩衝區。

1

的newImage被開始destructored當它超出範圍,我猜測append正在做一些淺拷貝,只存儲對圖像的引用。 QT自動引用計數與一些對象,但我不記得的細節

嘗試創建新的QImage並將指針存儲在imageBackups(反正更好的方法)。

像這樣的東西(注imageBackups現在需要的QImage *數組)

QImage pImage = new QImage(QSize(100,100), QImage::Format_RGB32); 
pImage->fill(qRgb(255, 0, 0)); 
imageBackups.append(pImage); 
+0

對於上面哪個代碼,你說我應該使用新的?當你寫QImage newImage(...); ,你不是在創建一個新的QImage對象嗎?另外,在追加程序中,我沒有看到任何可以提及新的地方。 – Ahmad 2010-06-25 17:05:49

+0

好吧,你是對的淺拷貝的事情..如果我改變了第二個備份代碼: QImage newImage(QSize(100,100),QImage :: Format_RGB32); newImage.fill(qRgb(255,0,0)); imageBackups.append(newImage); newImage。〜QImage();回覆沒有工作...但我通過使用這個: QImage newImage(QSize(100,100),QImage :: Format_RGB32); newImage.fill(qRgb(255,0,0)); imageBackups.append(newImage.copy(QRect())); newImage。〜QImage(); 但原來的問題仍然存在... – Ahmad 2010-06-25 17:11:24

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)); 

我看不出這個一事無成,這或許可以解釋爲什麼似乎沒有什麼,當你恢復的情況發生。