Как использовать фреймворк QT-Undo в конструкторе

Допустим, у меня есть QUndoCommand для создания объекта и для изменения цвета.

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, является разным классом каждый раз, когда он вызывает фабричный метод.

Таким образом, созданный объект сам устанавливает свои значения в конструкторе. скажем, его цвет устанавливает синий. Потому что изменение самого цвета — это команда, которую я бы также назвал командой.

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

Теперь к проблеме:

Если я создаю объект, отмена выглядит так:

  1. создать объект -> изменить цвет

чем отменить создание, которое вызывает:

  1. изменить цвет назад

  2. delte Object

и чем повторить команду

  1. создать объект -> изменить цвет (вызывается конструктором)
  2. изменить цвет (вызывается из откатки)

и вторая смена цвета — моя проблема. поэтому он уже есть в стеке, но вызывает его в конструкторе, который он вызывает / создает во второй раз.

Конечно, я могу просто вызвать изменение цвета без стека команд, но мне нравится иметь представление о том, что все должно быть выполнено в виде команд. В противном случае я должен написать их два раза, что кажется довольно грязным, и я должен сохранить обе версии изменения цвета.

Изменение цвета — это просто пример, в моем случае это создание childObject. Также он отслеживает каждый объект с помощью uuids.

Так есть ли умный способ справиться с такими структурами?

0

Решение

Как насчет добавления небольшой модификации в ваш класс Model для включения команд, которые не добавляются в стек отмены, например:

static void changeColor(ObjectInterface *target, QColor const& color, bool undoable = true) {
if (undoable) {
undoStack->beginMacro("Change Color");
undoStack->push( new CommandChangeColor(target,color));
undoStack->endMacro();
} else {
QUndoCommand *cmd = new CommandChangeColor(target, color);
cmd->redo();
delete cmd;
}
}

Тогда вы можете сделать:

class BlueObject : public ObjectInterface {
BlueObject() {
Model::changeColor(this,Qt::blue, false); // false to skip adding it to the undo stack
};
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]