2012-05-02 3 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 в качестве прокси-сервера для вашей реальной команды отмены - это означает, что вы можете сэкономить немалую память, поскольку, когда ваша команда отмены сохраняется в файл, вы можете удалить внутренний указатель/установить его to null. Затем восстановите его позже.