如何在构造函数中使用QT Undo框架
How to use QT-Undo framework in constructor
假设我有一个用于创建对象和更改颜色的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创建的对象每次都是一个不同的类,因为它调用的是factorymethod。
因此,被创造物本身就是在建构主义中设定自己的价值观。比方说它将他的颜色设置为蓝色。因为改变颜色本身就是一个命令,我也将其称为命令。
// 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);
};
}
现在问题来了:
如果我创建对象,撤销堆栈看起来像:
- 创建对象->更改颜色
而不是撤消触发的创建:
更改颜色返回
delte对象
然后恢复命令
- create Object->更改颜色(由构造函数调用)
- 更改颜色(从撤消堆栈调用)
第二次更改颜色是我的问题。所以有一个已经在堆栈中,但导致它在构造函数中第二次被调用/创建。
当然,我可以在没有命令堆栈的情况下调用颜色更改,但我喜欢把所有事情都作为命令来完成。否则,我必须写两次,这似乎有点脏,我必须维护两个版本的颜色变化。
颜色变化只是一个例子,在我的例子中它创建了childObject。它还通过uuid跟踪每个对象。
那么,有没有一种聪明的方法来处理这种结构呢?
如何在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
};
}
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- 如何在构造函数中使用QT Undo框架