2012-05-02 51 views

回答

1

沒有內置的方法。我認爲在會話之間保存撤消堆棧並不常見。您必須通過迭代堆棧中的命令來自行序列化命令,並使用QDataStream保存每個人的唯一數據。它可能是這個樣子:

... 
dataStream << undoStack->count(); // store number of commands 

for (int i = 0; i < undoStack->count(); i++) 
{ 
    // store each command's unique information 
    dataStream << undoStack->command(i)->someMemberVariable; 
} 
... 

然後你會再次使用QDataStream將數據反序列化回QUndoCommands。

您可以使用QFile處理文件管理。這裏描述

+0

寫入磁盤還有其他一些原因 - 如果您有500個撤消命令,它會增加內存使用量。 – paulm

1

使用Qt的序列:

Serialization with Qt

然後你QUndoCommands中您可以使用一個臨時文件,將數據寫入到它:

http://qt-project.org/doc/qt-4.8/qtemporaryfile.html

然而,這可能導致你是一個問題,因爲每個文件都保持打開,所以在某些平臺(Linux)上,你可能會用完打開的文件句柄。

爲了解決這個問題,你不得不創造它處理你的命令,一些其他的工廠類型的對象 - 那麼這可能在一個QTemporaryFile參考自動傳遞。此工廠/ QUndoCommand看護者對象必須具有與QUndoCommands相同的生命週期。如果沒有,那麼臨時文件將從磁盤中刪除,並且您的QUndoCommands會中斷。

你可以做的另一件事是使用QUndoCommand作爲你真正的撤消命令的代理 - 這意味着你可以節省相當多的內存,因爲當你的撤消命令被保存到文件時,你可以刪除內部指針/設置它爲空。然後再恢復它。