Допустим, у меня есть QUndoCommand
для создания объекта и для изменения цвета.Как использовать рамки QT-Undo в конструкторе
class ObjectInterface{
QColor color;
}
class CommandCreateObject : public QUndoCommand {
public:
CommandCreateObject(QString const& objectName);
void undo() Q_DECL_OVERRIDE;
void redo() Q_DECL_OVERRIDE;
}
class CommandChangeColor : public QUndoCommand{
public:
CommandCreateObject(QString const& objectName);
void undo() Q_DECL_OVERRIDE;
void redo() Q_DECL_OVERRIDE;
}
Теперь объект, созданный CommandCreateObject является гладкошерстных класс каждый раз, потому что это вызов factorymethode.
Таким образом, сам созданный объект устанавливает свои значения в contructor. скажем, устанавливает его цвет в синий. Причиной изменения самого цвета является команда, которую я бы назвал ее как Command.
// lets also say there is a Model from wich all Commands are triggered
class Model {
static QundoStack *undoStack;
static void changeColor(ObjectInterface *target, QColor const& color) {
undoStack->beginMacro("Change Color");
undoStack->push(new CommandChangeColor(target,color));
undoStack->endMacro();
}
staic void createObject(QString const& objectName) {
undoStack->beginMacro("Create Object");
undoStack->push(new CommandCreateObject(objectName));
undoStack->endMacro();
}
}
class BlueObject : public ObjectInterface {
BlueObject() {
Model::changeColor(this,Qt::blue);
};
}
Теперь к проблеме:
Если я создать объект, undostack выглядит как:
- создать объект -> изменить цвет
чем Отменяет создание, которое вызывает :
Изменение цвета Назад
delte Объект
и чем Повторяет команды
- создания объекта -> изменение цвета (так называемый конструктором)
- изменение цвета (вызывается из undostack)
и второй цвет изменения это моя проблема. поэтому он уже находится в стеке, но вызывает его в contructor, который его вызвал/создал второй раз.
Конечно, я могу просто вызвать изменение цвета без командного стека, но мне нравится иметь представление о том, что все сделано как команды. В противном случае я должен написать их два раза, что кажется грязным, и я должен поддерживать обе версии изменения цвета.
Изменение цвета - это всего лишь пример, в моем случае его создание childObject. Также он отслеживает каждый объект по uuids.
Итак, есть ли разумный способ обработки таких структур?