原文网址: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
#include
在构造函数里,用替换成下面的代码替换把菜单加到菜单栏的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指针参数。
Scene::Scene( QUndoStack* undoStack ) : QGraphicsScene()
在构造函数里添加这行代码把参数值存储到私有变量。
// 初始化变量
m_undoStack = undoStack;
编译和运行
当你尝试运行程序时新的代码将被编译。测试程序并检验下我们新添加的菜单项。