第7部份:添加一个撤销堆栈

本文详细介绍了如何在QtCreator应用程序中实现撤销与重做功能,包括增强类MainWindow、构造函数修改、类Scene的更新及运行与测试。通过新增菜单项和撤销堆栈视图,实现对添加、移动和删除电台的操作记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文网址:http://www.dazzle.plus.com/linux/QtCreator/part07.htm

介绍

并非所有应用程序都需要让用户撤销和重做的命令或动作的能力,但是如果我们在应用程序设计和实现阶段的前期开始实现这功能很简单。在我们将在应用程序中使用Qt撤销框架实现这个功能。

在这部份教程我们准备工作是给应用程序添加一个撤销堆栈和撤销堆栈视图。这将通过增强类MainWindow创建撤销堆栈,添加几个菜单项并且把撤销堆栈指针传递给Scene。下部份的教程,我们将会使用这个撤销堆栈实现添加,移动和删除电台的撤销和重做命令。

增强类MainWindow

mainwindow.h

添加类QUndoStack和QUndoView前置定义。

class QUndoStack;
class QUndoView;

在函数showMessage定义后添加新的槽方法showUndoStack。调用它将打开我们应用程序的撤销堆栈视图。

void showUndoStack();               // 打开一个新的撤销堆栈窗体

在变量m_scence定义后面添加两个新的私有变量。存储我们撤销堆栈和撤销堆栈视图指针。

  QUndoStack*  m_undoStack;           // 撤销堆栈
  QUndoView*   m_undoView;            // 撤销堆栈视图

mainwindow.cpp

引进类QUndoStack和QUndoView的头文件。

#include <QUndoStack>
#include <QUndoView>

 

在构造函数里,用替换成下面的代码替换把菜单加到菜单栏的6行代码。虽然这次我们仍然把菜单项添加到菜单栏,但是我们把编辑和视图的菜单项指针存储在本地变量里。我们也要创建撤销堆栈并初始化一些新的私有变量,在视图菜单中添加“undo Stack”菜单项和编辑菜单中添加撤销和重做菜单项。

  // 添加下拉菜单
  menuBar()->addMenu( "&File" );
  QMenu*  editMenu = menuBar()->addMenu( "&Edit" );
  QMenu*  viewMenu = menuBar()->addMenu( "&View" );
  menuBar()->addMenu( "&Simulate" );
  menuBar()->addMenu( "&Help" );

  // 新建undo堆栈和联系菜单操作
  m_undoStack = new QUndoStack( this );
  m_undoView  = 0;
  viewMenu->addAction( "Undo stack", this, SLOT(showUndoStack()) );
  QAction* undoAction = m_undoStack->createUndoAction( this );
  QAction* redoAction = m_undoStack->createRedoAction( this );
  undoAction->setShortcut( QKeySequence::Undo );
  redoAction->setShortcut( QKeySequence::Redo );
  editMenu->addAction( undoAction );
  editMenu->addAction( redoAction );

此外,在构造函数里更改创建类Scene代码,把撤销堆栈指针作为参数传递给类Scene。

m_scene = new Scene( m_undoStack );


添加打开撤销堆栈视图槽的方法代码。这里代码会判断撤销堆栈视图是否被创建,如果没有创建将创建并且设置窗体标题。我们还要设置窗体属性WA_QuitOnClose为false,这样撤销堆栈视图被用户关闭应用程序也不会退出。

/*********************************** showUndoStack ***********************************/

void  MainWindow::showUndoStack()
{
  // open up undo stack window
  if ( m_undoView == 0 )
  {
    m_undoView = new QUndoView( m_undoStack );
    m_undoView->setWindowTitle( "QSimulate - Undo stack" );
    m_undoView->setAttribute( Qt::WA_QuitOnClose, false );
  }
  m_undoView->show();
}

 

增加类Scene

scene.h

现在类Scene需要更改,接受一个撤销堆栈指针作为构造函数参数。添加类QUndoStack的前置定义。

class QUndoStack;

更改构造函数定义接受一个QUndoStack指针参数。

Scene( QUndoStack* ); // 构造函数

在类中定义一个私有变量用于存储指针。

private:
  QUndoStack*  m_undoStack;                 // 撤销堆栈
 
 

scene.cpp

引入类QUndoStack头文件。

#include <QUndoStack>

更改构造函数定义接受一个QUndoStack指针参数。

Scene::Scene( QUndoStack* undoStack ) : QGraphicsScene()

在构造函数里添加这行代码把参数值存储到私有变量。

  // 初始化变量
  m_undoStack  = undoStack;

编译和运行

当你尝试运行程序时新的代码将被编译。测试程序并检验下我们新添加的菜单项。




 

 

 




 



 

在Maya中使用PySide实现撤销堆栈时,确保正确地添加堆栈的关键在于每当对UI或模型有重大改变时,都要保存一个操作前的状态。这通常通过以下步骤来实现: 1. **创建回调函数**:当你希望捕获的操作发生时(比如修改图形界面元素、改变对象属性等),定义一个回调函数或者事件处理器。 ```python def on_change(event): # 获取当前状态(比如模型的位置、尺寸、颜色等) current_state = get_current_model_state() # 将当前状态添加撤销堆栈 undo_stack.append(current_state) ``` 2. **注册回调**:在适当的时候,如按钮点击或窗口关闭前,注册这个回调函数。 ```python undo_manager.registerUndoAction('Change', on_change) ``` 3. **设置撤销堆栈**:使用`undo_stack`变量(假设已经定义)来存储一系列的状态。你可以使用list或其他队列数据结构,每次追加新状态到队首。 4. **撤销操作**:当用户选择撤销时,从堆栈头部移除并恢复上一个状态。 ```python def undo(): if undo_stack: last_state = undo_stack.pop() restore_model_state(last_state) ``` 5. **重做功能**:为了支持重做,可以维护一个独立的"redo stack",当撤销后又想恢复到前一个状态时,可以将之前从撤销堆栈移除的状态放回重做堆栈。 记住,为了保持良好的用户体验,应当限制撤销和重做的次数,避免因为大量的操作导致内存消耗过大。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值