Qt的操作堆棧

用Qt做操作堆棧主要用到這麼幾個類QUndoCommand、QUndoStack、QUndoGroup和QUndoView,下面詳細介紹

QUndoCommand

該類就是堆棧中的操作元,我們在用的時候需要創建該類的子類,重寫該類的一些方法,並將操作的具體實現放到繼承的子類中,通常需要重寫redo、undo、mergeWith、id等方法

redo

該方法是操作的具體實現,也就是做和重做時所調用的方法

undo

該方法是操作的反操作,也就是執行撤銷時候的操作

mergeWith和id

這兩個方法不是必須重寫的,如果想將多個操作合併成一個,則需要重寫這兩個方法。對於需要合併的操作,需要重寫id方法返回相同的值,該值需要大於1(或者是0?具體數記不清了,查下文檔吧),然後在mergeWith方法中進行數據合併的操作,合併成功返回true,合併失敗返回false,基本實現框架大概像這樣:

int SubCommand::id() const
{
    return SubCommandId;
}

bool SubCommand::mergeWith(const QUndoCommand *command)
{
	// 先判斷是否是需要合併的id
    if (command->id() != SubCommandId)
        return false;
        
	// 具體的數據合併
    return true;
}

setText

該方法不需要重寫,用來設置QUndoView中對操作堆棧中的每個操作的顯示字符串

QUndoStack

存放操作的堆棧,主要用到的方法有push、canRedo、redo、canUndo、undo,在需要執行操作的位置,首先new一個SubCommand的實例,然後以該實例爲參數調用QUndoStack的push方法,在push方法內會調用SubCommand的redo方法執行具體才操作。其餘四個方法看名字就好理解了,判斷是否能夠撤銷或者重做,然後執行撤銷或者重做操作,使用方法大致如下:

// 需要執行操作的位置
m_undoStack->push(new SubCommand();

// 撤銷動作
if (m_undoStack->canUndo())
		m_undoStack->undo();

// 重做動作
if (m_undoStack->canRedo())
		m_undoStack->redo(); 

QUndoGroup

該類主要用於多文檔程序,用於管理QUndoStack,每個文檔有一個QUndoStack,然後添加到QUndoGroup中進行管理。

QUndoView

該類用於顯示執行的堆棧,這個用法很簡單,new出來直接show就行了,通常在調試中使用。如果想要顯示操作堆棧的內容,需要在SubCommand的構造函數中使用setText方法來設置每個SubCommand在QUndoView中的描述字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章