QUndoCommand你会用吗



采用Qt's Undo Framework实现undo和redo操作。

比如在做一个记事本程序  想要实现一个删除文本的操作,这个操作可以撤销和重现,即可以实现所谓的undo()和redo()操作。

此时只需让删除操作继承至QUndoCommand类,比如叫做DeleteTextCommand,并实现redo和undo这两个虚函数。在删除操作的响应槽函数SlotDeleteText()中,创建DeleteTextCommand对象,并放入QUndoStack。

如下代码所示:

删除类.h文件
class DeleteTextCommand:public QUndoCommand
{
public:
// 构造函数
         DeleteTextCommand();
  // 实现redo 、undo
void undo();
void redo();
}
在undo和redo函数中实现具体的操作,在redo中实现删除操作,undo中实现撤销删除操作,恢复删除之前的状态,思路是在redo中保存一份被删除的东西的列表,在undo中获取,就是使用这份列表进行复原。
删除槽函数:
void CMainWin::slotDeleteText()
{
    QUndoCommand *pDeleteTextCommond = new DeleteTextCmd();
    m_pUndoStack->push(pDeleteTextCommond);
//push的时候会自动去调用DeleteTextCmd的redo方法。
}
需要注意的是:在QUndoStack把命令push到堆栈的时候,会自动调用一次此命令的redo方法。
在主函数中  实现撤销和复原功能如下,如下写:

void WorkflowSceneManager::slotUndo()
{
    m_pUndoStack->undo();//自动调用DeleteTextCommand的undo方法
    HideAllModuleNameEdit();
}
void WorkflowSceneManager::slotRedo()
{
    m_pUndoStack->redo();//自动调用DeleteTextCommand的redo方法
    HideAllModuleNameEdit();
}
具体原理为command设计模式,待补充。





 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QUndoCommand 是 Qt 框架提供的一个用于实现撤销和重做操作的类,通常需要继承该类来实现具体的操作。下面是一个简单的例子: 假设我们有一个文本编辑器,可以在其中进行添加和删除文本的操作。我们想要实现撤销和重做这两个功能,就可以使用 QUndoCommand。 首先,我们需要创建一个继承自 QUndoCommand 的类,比如叫做 TextCommand。在这个类中,我们需要实现两个方法:undo() 和 redo(),分别用于撤销和重做操作。在这个例子中,我们可以将这两个操作实现为添加或删除文本。 ``` class TextCommand : public QUndoCommand { public: TextCommand(const QString& text, QTextEdit* editor, bool add = true) : m_text(text), m_editor(editor), m_add(add) {} void undo() override { if (m_add) m_editor->textCursor().deletePreviousChar(); else m_editor->textCursor().insertText(m_text); } void redo() override { if (m_add) m_editor->textCursor().insertText(m_text); else m_editor->textCursor().deletePreviousChar(); } private: QString m_text; QTextEdit* m_editor; bool m_add; }; ``` 在上面的代码中,我们可以看到在构造函数中传入了要添加或删除的文本、文本编辑器以及一个标志位 add,用于表示是添加还是删除操作。在 undo() 和 redo() 方法中,我们根据这个标志位来进行相应的操作。 接下来,在我们的主程序中,我们需要创建一个 QUndoStack 对象,该对象用于管理撤销和重做操作。我们还需要为添加和删除文本的操作创建两个槽函数: ``` void MainWindow::on_addButton_clicked() { QString text = ui->lineEdit->text(); TextCommand* command = new TextCommand(text, ui->textEdit, true); m_undoStack->push(command); } void MainWindow::on_deleteButton_clicked() { TextCommand* command = new TextCommand("", ui->textEdit, false); m_undoStack->push(command); } ``` 在上面的代码中,我们创建了两个 TextCommand 对象,分别用于添加和删除文本。然后将它们推入到我们创建的 QUndoStack 对象中。 最后,我们需要在我们的主程序中创建一个 QUndoView 对象,该对象用于显示撤销和重做操作的历史记录。我们还需要将我们创建的 QUndoStack 对象与该 QUndoView 对象关联起来: ``` m_undoStack = new QUndoStack(this); QUndoView* undoView = new QUndoView(m_undoStack); undoView->setWindowTitle("Undo View"); undoView->show(); ``` 现在,我们就可以运行我们的程序,并尝试添加和删除文本,并进行撤销和重做操作了。 以上就是一个简单的使用 QUndoCommand 的例子。在实际的应用中,我们可以根据具体的需求来进行更加复杂的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值