2017-01-04 11 views
0

Допустим, у меня есть 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 выглядит как:

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

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

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

  2. delte Объект

и чем Повторяет команды

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

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

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

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

Итак, есть ли разумный способ обработки таких структур?

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^