Название: Проясните с QUndoStack Отправлено: Fregloin от Июнь 06, 2013, 11:46 Есть такая команда:
Код: #include <QGraphicsItem> Код: #include "cappenditemcommand.h" Вызывается в этом месте: Код: void QExGraphicsScene::addRailItem(const CInterfaceTag &itemClass, const QPointF &position) Мне нужно добавить элемент на сцену, и запомнить действие отмены. Почему при push вызывается сразу redo() и у меня прога падает в рекурсию... или я что то не понимаю. Название: Re: Проясните с QUndoStack Отправлено: mutineer от Июнь 06, 2013, 11:54 Если fundoStack это QUndoStack, то
Цитировать void QUndoStack::push ( QUndoCommand * cmd ) Pushes cmd on the stack or merges it with the most recently executed command. In either case, executes cmd by calling its redo() function. Название: Re: Проясните с QUndoStack Отправлено: Fregloin от Июнь 06, 2013, 12:10 Хорошо, как мне к примеру сделать отмену перемещения элемента на сцене?
Код: void QExGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event) где команда отмены перемещения Код: void CMoveItemCommand::setBeginPos(const QPointF &pos) проблема в том, что вызывается redo(), перемещение уже сделано мышью на сцене, и получается делается еще раз... Название: Re: Проясните с QUndoStack Отправлено: mutineer от Июнь 06, 2013, 12:18 1) Не реагировать на первый вызов redo()
2) использовать setPos вместо moveBy Название: Re: Проясните с QUndoStack Отправлено: Fregloin от Июнь 06, 2013, 12:19 пришлось вводить переменную, которая смотрит, было ли уже сделано redo().
блин, немного неудобный механизм Undo. почему он вызывает redo() при помещении в стек? логично было бы сделать какие то действия на сцене, передать нужные параметры для отмены и поместить команду в стек. а так получается в команде нужно реализовывать собственно изменения, которые раньше производились в самой сцене... конечно решилось это дружестенными классами, тем немее туповато. Название: Re: Проясните с QUndoStack Отправлено: Fregloin от Июнь 06, 2013, 12:20 т.е. создание и удаление элементов на моей сцене сложнее чем просто добавить/удалить.
а теперь нужно рыться в потрохах сцены из команды... Название: Re: Проясните с QUndoStack Отправлено: Авварон от Июнь 07, 2013, 15:53 а так получается в команде нужно реализовывать собственно изменения, которые раньше производились в самой сцене... конечно решилось это дружестенными классами, тем немее туповато. Вы не поверите. Именно так и должен работать паттерн "команда". Название: Re: Проясните с QUndoStack Отправлено: Fregloin от Июнь 14, 2013, 18:20 Сделал несколько комманд, все работает, отменяет, восстанавливает.
Но при попытке очистить стэк изменений при загрузке нового документа у меня вылетает сегментация. причем, если команд в стеке нет, то сегментации тоже нет. у меня несколько вкладок на табБаре, у каждой вкладки свой стек. эти стеки кидаю в группу QUndoGroup. Не пойму причину сегментации. До внесения поддержки стков изменения сегментаций не было. Название: Re: Проясните с QUndoStack Отправлено: Old от Июнь 14, 2013, 18:27 Вы главное код нам не показывайте. Что бы мы гадали подольше. ;)
|