青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Qt Undo Framework Demo

Posted on 2015-01-13 18:59 eryar 閱讀(6756) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Qt Undo Framework Demo

eryar@163.com

Abstract. Qt’s Undo Framework is an implementation of the Command Pattern, for implementing undo/redo functionality in applications. The Command pattern is based on the idea that all editing in an application is done by creating instances of command objects. Command objects apply changes to the document and are stored on a command stack. Furthermore, each command knows how to undo its changes to bring the document back to its previous state. As long as the application only uses command objects to change the state of the document, it is possible to undo a sequence of commands by traversing the stack downwards and calling undo on each command in turn. It is also possible to redo a sequence of commands by traversing the stack upwards and calling redo on each command. 

Key Words. Qt, Undo/Redo, Command Pattern, Model/View

1. Introduction

在交互應用程序中撤銷和重做(Undo/Redo)能力是很重要的。像常見的軟件Office,AutoCAD等,有了撤銷功能,用戶體驗更舒服。一般都會使用Command模式來實現這一功能。

命令模式通過將請求本身變成一個對象來使工具箱對象可向未指定的應用對象提出請求,這個對象可被存儲并像其他對象一樣被傳遞。這一模式的關鍵是一個抽象的Command類,它定義了一個可執行操作的接口。其最簡單的形式是一個抽象的Execute操作。具體的Command子類將接收者作為其一個實例變量,并實現Execute操作,指定接收者采取動作,而接收者執行該請求所需要的具體信息。在GoF的《Design Patterns》中,給出了Command模式的一般結構,如圖1.1所示:

wps_clip_image-581

Figure 1.1 Command pattern structure

將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄成日志,以及支持可撤銷的操作。

支持任意層次的撤銷和重做命令的最后一步是定義一個命令歷史記錄(Command History),或稱為已執行的命令列表。從概念上理解,命令的歷史記錄看起來有如下形狀:

wps_clip_image-5187

Figure 1.2 Command History

每個圓代表一個Command對象,標有present的對象即為當前命令對象。當我們調用Unexecute()后,標有present的對象將會向左移;當調用Execute(),標有present的對象將會向右移。重復這個過程,我們可以進行多層次的撤銷,層次數只受命令歷史記錄長度的限制。

在Qt的Undo框架中主要包括以下幾個類:

v QUndoCommand:這個類相當于Command模式中的那個抽象基類Command,所有這些命令都被保存到undo棧中,在其派生類中實現undo和redo函數。

v QUndoStack:這個相當于命令歷史記錄,其中保存了Command對象的列表。

v QUndoGroup:是一個undo stack的組合。

v QUndoView:是顯示undo堆棧中內容的一個列表組件,在這個視圖中點擊命令的名稱也可以實現與Undo/Redo按鈕相同的作用。

本文通過一個簡單的例子來示例Qt中Undo框架,先在簡單的List模型中實現,進而在Tree上實現。掌握Qt的這個框架,就可以不用OpenCASCADE的OCAF了,并且Qt的代碼用起來還是相對簡單清晰的。

2.Example

Qt提供了一個Undo框架的示例,程序還涉及到圖形繪制相關的內容,程序效果如下圖2.1所示:

wps_clip_image-17325

Figure 2.1 Qt Undo Framework Example

結合這個示例程序,學習一下Qt的Undo框架,從而寫出一個更簡單的程序,代碼如下所示:

class InsertCommand : public QUndoCommand
{
public:
    InsertCommand(
const QModelIndex& theIndex, QStringListModel* theModel);
    
~InsertCommand();

public:
    
virtual void undo();
    
virtual void redo();

private:
    QModelIndex mIndex;
    QStringListModel
* mModel;
};

首先,從QUndoCommand派生出一個插件字符串的類InsertCommand,并要實現undo()和redo()這兩個虛函數,實現代碼如下所示:

void InsertCommand::undo()
{
    mModel
->removeRows(mIndex.row(), 1);
}

void InsertCommand::redo()
{
    mModel
->insertRows(mIndex.row(), 1);
    mModel
->setData(mIndex, QString("Insert string " + QString::number(mIndex.row())));
}

這樣在響應工具欄按鈕的函數中,只需要生成這個命令,并將命令加入到命令棧中即可,代碼如下:

void undoTest::insertString()
{
    QModelIndex aIndex 
= mListView->currentIndex();

    mUndoStack
->push(new InsertCommand(aIndex, mListModel));
}

程序運行效果如下圖2.2所示:

wps_clip_image-9457

Figure 2.3 Test Qt Undo Framework

通過工具欄上的undo/redo及命令列表中選擇,都可以實現命令的回退及重做。完整的程序代碼可通過文后鏈接下載。

3.Conclusion

在學習C++基本語法后,可以看看GoF的《設計模式》。剛剛接觸可能感覺有些抽象,這時可以使用Qt來編寫一些程序來練練手。用Qt來編程感覺比MFC要舒服很多,有些類封裝得很直接,易于使用。盡管MFC中也有個Document/View的設計模式,但是Qt中的MVC用起來更直接。通過使用現有的框架,來理解那些抽象的設計模式,從而加深面向對象的觀念,讓自己的程序更簡單,有趣。

OpenCASCADE的OCAF框架也提供了一個數據框架,基于這個樹形的框架,可以存儲層次表示的數據,且也提供了Undo/Redo的支持。基于OCAF框架,可以快速開發出一定功能的專業軟件了。但是要使用OCAF框架,涉及的OpenCASCADE庫很多。如果打算開發一個輕量級的三維程序,而又正好選擇了Qt來開發GUI,這時就可以考慮使用Qt的MVC框架及在這個框架上的Undo/Redo功能,這樣開發效率可以相對高一些,且程序發布時依賴的動態庫也要少很多。

流行的工廠設計軟件中的數據框架多用樹形結構,樹中每個結點上的屬性可以讓用戶自由擴展,像OCAF中通過TDataStd_Integer添加一些整數屬性一樣,及用TDataStd_Name添加名稱屬性。但是OCAF中添加屬性有些局限性,因為每種屬性是用GUID來區別的,所以每個結點上同一種屬性只能有一個。

所以用Qt的MVC框架來根據需要實現一個自定義的樹形Model,再基于V3d_Viewer實現一個顯示三維的View,即可以實現一個簡單,但看上去相對專業的CAD建模程序了。

4. References

1. GoF. Design Patterns-Elements of Reusable Object-Oriented Software.機械工業出版社. 2010

2. Qt5.4. Overview of Qt’s Undo Framework. 2014

3. Qt5.4. Undo Framework Example. 2014

4. OpenCASCADE6.8.0. OCAF. 2014

5. OpenCASCADE6.8.0. OCAF White Paper. 2014

6. OpenCASCADE6.8.0. Distribution of Data Through OCAF Tree. 2014

 

PDF Version and Source code: Qt Undo Framework Demo

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品国精品久久99热一| 欧美成人免费大片| 国产精品成人国产乱一区| 欧美国产亚洲视频| 欧美日韩亚洲一区二区三区| 欧美日韩在线一区二区| 国产精品v日韩精品v欧美精品网站| 欧美三级免费| 国产一区免费视频| 亚洲狠狠婷婷| 亚洲一区二区在线观看视频| 午夜精品一区二区三区在线播放| 欧美中文字幕在线视频| 免费成人在线观看视频| 日韩亚洲欧美在线观看| 亚洲小说区图片区| 一本色道久久加勒比88综合| 午夜在线a亚洲v天堂网2018| 乱中年女人伦av一区二区| 欧美日韩国产黄| 国产午夜一区二区三区| 日韩视频免费大全中文字幕| 欧美一区视频在线| 亚洲国产精品久久久| 亚洲精品久久久蜜桃| 午夜在线一区二区| 欧美精品一区二区三区视频| 国产精品区一区| 亚洲第一精品福利| 午夜日韩电影| 亚洲日本免费| 久久精品综合| 国产精品免费网站| 亚洲国产欧美不卡在线观看| 欧美一区二区三区视频免费播放| 欧美 日韩 国产精品免费观看| 在线视频精品一区| 欧美成人一区二区三区在线观看| 国产午夜精品视频| 亚洲一区二区精品视频| 欧美激情中文不卡| 午夜久久tv| 久久激情视频| 另类酷文…触手系列精品集v1小说| 欧美精品成人91久久久久久久| 国内成人精品一区| 久久久蜜桃一区二区人| 亚洲欧美激情四射在线日 | 久久婷婷丁香| 亚洲视频在线观看视频| 欧美精品三级| 亚洲乱码国产乱码精品精可以看| 免费观看日韩| 久久精品国产亚洲aⅴ| 国产乱理伦片在线观看夜一区| 中日韩美女免费视频网址在线观看| 欧美高清在线视频观看不卡| 久久久久久久久久久成人| 国模叶桐国产精品一区| 久久久精品五月天| 亚洲欧美日韩在线一区| 国产伦精品一区二区三区视频孕妇| 中文精品99久久国产香蕉| 一本大道久久a久久精二百| 欧美日韩一区成人| 午夜精品免费| 欧美一区二区三区四区夜夜大片| 国产亚洲亚洲| 欧美成人午夜激情视频| 欧美成人国产一区二区| 日韩亚洲在线观看| 亚洲免费观看| 国产精品久久久91| 久久精品国产亚洲一区二区| 久久精品综合| 日韩小视频在线观看专区| 一区二区三区国产| 国产日本欧美一区二区| 久久久久久夜| 欧美成人精品一区| 亚洲性视频网站| 欧美一级淫片播放口| 亚洲精美视频| 亚洲一区二区三区高清 | 亚洲香蕉在线观看| 亚洲欧美在线免费观看| 激情成人亚洲| 亚洲精品色图| 国产视频不卡| 亚洲国产精品久久久久久女王| 欧美日韩国产bt| 久久精品一本| 欧美伦理影院| 久久久久久午夜| 欧美日韩一区自拍| 久久久999国产| 欧美精品成人| 久久综合影视| 好看的日韩视频| 一区二区三区精密机械公司| 国产精品黄视频| 欧美.日韩.国产.一区.二区| 欧美日韩中文字幕综合视频| 久久夜色精品国产欧美乱| 欧美日韩国产综合一区二区| 久久青草欧美一区二区三区| 欧美日韩中文字幕日韩欧美| 美国成人直播| 国产精品一区二区黑丝| 亚洲国产精品传媒在线观看 | 欧美1区2区3区| 欧美三级电影一区| 欧美高清视频一区二区| 国产日韩欧美亚洲| 日韩一区二区福利| 亚洲激情不卡| 久久精品官网| 久久精品观看| 国产精品sm| 亚洲黄色一区| 在线日韩中文字幕| 久久精品夜色噜噜亚洲a∨| 亚洲欧美区自拍先锋| 欧美精品自拍| 亚洲人永久免费| 亚洲精品免费一区二区三区| 六十路精品视频| 老司机免费视频一区二区三区| 国产农村妇女精品一区二区| 一区二区三区日韩欧美| 亚洲视频在线免费观看| 欧美区视频在线观看| 亚洲欧洲在线一区| 亚洲美女在线观看| 欧美精品一区二区三区视频 | 久久精品91久久香蕉加勒比| 欧美天堂亚洲电影院在线观看| 最新国产精品拍自在线播放| 亚洲国产欧美另类丝袜| 欧美 亚欧 日韩视频在线| 欧美黑人多人双交| 91久久在线视频| 久久亚洲高清| 伊人成人开心激情综合网| 日韩亚洲不卡在线| 91久久国产精品91久久性色| 欧美成人高清视频| 一区二区高清在线观看| 欧美私人啪啪vps| av成人免费在线| 亚洲大胆美女视频| 久久久久久亚洲精品中文字幕| 国产精品福利久久久| 亚洲视频大全| 亚洲国产日韩美| 午夜免费日韩视频| 最新日韩欧美| 欧美精品亚洲精品| 亚洲小少妇裸体bbw| 一区二区三区**美女毛片| 欧美日韩一区二区三区高清| 亚洲欧美一区二区精品久久久| 激情伊人五月天久久综合| 国产精品夜夜嗨| 欧美日韩免费一区| 亚洲国产精品成人久久综合一区| 亚洲激情电影中文字幕| 欧美噜噜久久久xxx| 亚洲砖区区免费| 男人的天堂亚洲在线| 亚洲视频电影图片偷拍一区| 国产亚洲激情视频在线| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精选在线| 久久伊人亚洲| 亚洲欧美日韩精品久久久久| 在线免费观看欧美| 国产精品久久久久久久久久尿| 久久婷婷久久| 亚洲一区黄色| 亚洲精品国产拍免费91在线| 久久久久国内| 亚洲免费一在线| 亚洲精品国产拍免费91在线| 国产欧美一区二区精品性| 欧美精品激情在线观看| 久久精品中文字幕免费mv| 在线亚洲免费| 亚洲国产精品小视频| 久久久久这里只有精品| 亚洲一区二区久久| 亚洲人成在线播放| 尤物在线观看一区| 国产精品欧美久久| 欧美激情精品久久久久| 久久精品国产免费观看| 亚洲综合久久久久| 一区二区三区www| 亚洲国产岛国毛片在线| 老司机精品导航|