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

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 閱讀(6758) 評論(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

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

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

wps_clip_image-581

Figure 1.1 Command pattern structure

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

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

wps_clip_image-5187

Figure 1.2 Command History

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

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

v QUndoCommand:這個類相當(dāng)于Command模式中的那個抽象基類Command,所有這些命令都被保存到undo棧中,在其派生類中實(shí)現(xiàn)undo和redo函數(shù)。

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

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

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

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

2.Example

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

wps_clip_image-17325

Figure 2.1 Qt Undo Framework Example

結(jié)合這個示例程序,學(xué)習(xí)一下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,并要實(shí)現(xiàn)undo()和redo()這兩個虛函數(shù),實(shí)現(xiàn)代碼如下所示:

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())));
}

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

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

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

程序運(yùn)行效果如下圖2.2所示:

wps_clip_image-9457

Figure 2.3 Test Qt Undo Framework

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

3.Conclusion

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

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

流行的工廠設(shè)計軟件中的數(shù)據(jù)框架多用樹形結(jié)構(gòu),樹中每個結(jié)點(diǎn)上的屬性可以讓用戶自由擴(kuò)展,像OCAF中通過TDataStd_Integer添加一些整數(shù)屬性一樣,及用TDataStd_Name添加名稱屬性。但是OCAF中添加屬性有些局限性,因為每種屬性是用GUID來區(qū)別的,所以每個結(jié)點(diǎn)上同一種屬性只能有一個。

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

4. References

1. GoF. Design Patterns-Elements of Reusable Object-Oriented Software.機(jī)械工業(yè)出版社. 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>
            国产精品成人一区二区网站软件| 一本色道久久综合精品竹菊| 亚洲免费在线视频| 国产精品亚洲网站| 女人香蕉久久**毛片精品| 欧美国产精品专区| 欧美在线视屏| 欧美成年人网站| 一区二区三区高清视频在线观看| 亚洲欧美视频在线观看| 亚洲人成绝费网站色www| 一区二区三区欧美在线| 亚洲精选91| 欧美一区二区私人影院日本| 亚洲精品视频一区| 久久久国产精品一区| 亚洲女与黑人做爰| 男人的天堂成人在线| 一区二区三区久久| 久久久久欧美精品| 99这里只有精品| 欧美在线啊v一区| 亚洲一级在线观看| 欧美成人午夜视频| 欧美尤物一区| 欧美日韩中文字幕在线视频| 欧美大片在线观看| 国模精品娜娜一二三区| 亚洲私人黄色宅男| 一区二区三区高清不卡| 久久在精品线影院精品国产| 久久九九久精品国产免费直播| 欧美日韩亚洲三区| 久久av最新网址| 国产精品国产一区二区| 免费看的黄色欧美网站| 黄色成人精品网站| 亚洲中字黄色| 午夜综合激情| 国产伦精品一区二区三区在线观看| 欧美成人亚洲成人| 在线观看视频亚洲| 久久久久久亚洲精品杨幂换脸| 久久久久久综合| 国产日韩三区| 午夜精品三级视频福利| 欧美诱惑福利视频| 国产日韩av在线播放| 亚洲视频一区在线观看| 亚洲性xxxx| 国产精品腿扒开做爽爽爽挤奶网站| 一区二区三区av| 在线亚洲免费| 欧美视频二区36p| 亚洲视频高清| 欧美在线视频网站| 韩国一区二区三区美女美女秀| 亚洲综合三区| 久久精品99久久香蕉国产色戒| 国产偷国产偷精品高清尤物| 欧美中文字幕第一页| 免费的成人av| 亚洲国产一区二区视频| 欧美精品三级日韩久久| 99精品久久久| 久久国产精品一区二区三区| 欧美成人国产| 亚洲精品久久久久久久久久久久久 | 韩国一区二区三区在线观看| 久久精品国产亚洲高清剧情介绍| 久久久中精品2020中文| 亚洲国产视频一区| 欧美日韩中文字幕综合视频| 亚洲日本va午夜在线影院| 亚洲自拍另类| 国产一区二区三区在线观看视频| 久久综合网色—综合色88| 亚洲精品一二三| 亚洲欧美日韩区| 激情综合在线| 欧美国产精品| 亚洲欧美日韩天堂一区二区| 国产日韩av一区二区| 久久精品中文| 亚洲精品一区二区在线| 欧美精品粉嫩高潮一区二区| 99re66热这里只有精品3直播| 亚洲欧美中文在线视频| 国产精品久久久久久久免费软件 | 亚洲精选91| 久久精品国产综合| 亚洲国产精品毛片| 免费看成人av| 亚洲一区二区成人| 欧美激情精品久久久六区热门| 亚洲与欧洲av电影| 亚洲国产婷婷香蕉久久久久久| 亚洲视频在线免费观看| 亚洲欧美久久久久一区二区三区| 亚洲国产清纯| 亚洲激情影院| 在线观看欧美黄色| 在线观看成人小视频| 狠狠狠色丁香婷婷综合久久五月| 国产日韩av在线播放| 国产精品一区=区| 国产精品蜜臀在线观看| 国产精品久久久久久亚洲调教| 欧美日韩精品综合| 欧美日韩成人在线| 欧美精品一区二区精品网| 欧美激情亚洲另类| 欧美欧美全黄| 欧美日韩视频在线第一区| 欧美人成在线视频| 欧美日韩在线不卡一区| 欧美性大战xxxxx久久久| 国产精品hd| 国产女人aaa级久久久级| 国产日韩欧美视频在线| 国内一区二区三区| 在线看片一区| 日韩视频一区二区三区| 在线一区免费观看| 亚洲影院色无极综合| 欧美一区二区精品久久911| 欧美在线3区| 蜜桃av一区二区三区| 亚洲第一精品影视| 亚洲麻豆视频| 亚洲综合成人婷婷小说| 香蕉精品999视频一区二区 | 亚洲欧洲精品一区| aa级大片欧美| 性欧美办公室18xxxxhd| 久久久亚洲国产美女国产盗摄| 欧美不卡视频一区| 国产精品高清在线观看| 国产伊人精品| 亚洲每日更新| 久久av在线| 亚洲激情一区二区三区| 亚洲一区三区在线观看| 久久久久久**毛片大全| 欧美日韩免费高清一区色橹橹| 国产精品一区视频网站| 亚洲二区免费| 午夜在线精品| 亚洲国产精品毛片| 亚洲欧美日韩第一区| 欧美va天堂| 国产日产高清欧美一区二区三区| 亚洲人久久久| 久久精品毛片| 99re视频这里只有精品| 久久久久久9| 国产精品美女黄网| 亚洲精品视频在线| 久久偷窥视频| 亚洲视频在线免费观看| 免费亚洲电影在线观看| 国产欧美一区二区视频| 一本久道久久综合婷婷鲸鱼| 久久综合久久88| 亚洲欧美日韩国产精品| 欧美日韩国产免费| 亚洲高清不卡| 久久久久久有精品国产| 一区二区三区视频免费在线观看| 玖玖玖国产精品| 精品二区视频| 久久久www| 亚洲一区视频在线| 欧美日韩免费网站| 亚洲精品在线一区二区| 欧美成人午夜剧场免费观看| 欧美一区二区三区成人| 国产精品久久久亚洲一区| 一本色道久久综合一区| 亚洲丰满少妇videoshd| 久久久精品五月天| 国产一区二区三区黄| 小黄鸭精品密入口导航| 中日韩美女免费视频网址在线观看| 欧美韩日一区| 亚洲免费大片| 亚洲国产免费| 欧美国产日本高清在线| 91久久精品国产91久久性色| 免费亚洲网站| 久久综合电影| 一色屋精品亚洲香蕉网站| 久久人人爽人人| 久久九九国产精品| 在线欧美日韩| 亚洲第一黄色| 欧美精品三级在线观看| 一区二区三区蜜桃网| 夜夜躁日日躁狠狠久久88av| 欧美日韩综合在线|