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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Undo/Redo for Qt Tree Model

Posted on 2015-01-28 20:57 eryar 閱讀(4518) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE4.AVEVA Solution

Undo/Redo for Qt Tree Model

eryar@163.com

Abstract. Qt contains a set of item view classes that use a model/view architecture to manage the relationship between data and the way it is presented to the user. The separation of functionality introduced by this architecture gives developers greater flexibility to customize the presentation of items, and provides a standard model interface to allow a wide range of data sources to be used with existing item views. Model 3D aided design software such as AVEVA Plant/PDMS, Marine use the architecture to manage the design data source. The article demonstrate the Undo/Redo on the Qt Tree model.

Key Words. Model/View, MVC pattern, Undo/Redo, Tree Model

1. Introduction

現(xiàn)代稍微大型一點(diǎn)的軟件,要處理的數(shù)據(jù)量通常會(huì)比較大。這時(shí)就需要有一個(gè)唯一的數(shù)據(jù)源,且會(huì)對(duì)這個(gè)數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行增、刪、改的操作。如果沒有統(tǒng)一的數(shù)據(jù)源,數(shù)據(jù)會(huì)隨意地被創(chuàng)建和刪除,且創(chuàng)建和刪除的用戶界面也不統(tǒng)一,不利于軟件管理。基于唯一的數(shù)據(jù)源,并在這個(gè)基礎(chǔ)上提供統(tǒng)一的增刪改接口,不僅有利于軟件數(shù)據(jù)管理,還有利于事務(wù)的處理,即Undo/Redo功能。若引入腳本語(yǔ)言,如Tcl或Python,甚至可實(shí)現(xiàn)腳本命令對(duì)數(shù)據(jù)的操作,為程序增加二次開發(fā)功能。

wps_clip_image-28934

Figure 1. AVEVA Plant/PDMS Software

如上圖1所示為英國(guó)劍橋大學(xué)CADCENTRE出品的AVEVA Plant/PDMS軟件。PDMS使用了統(tǒng)一的數(shù)據(jù)源,左邊的導(dǎo)航樹及右邊的三維模型都是這個(gè)數(shù)據(jù)源的一種展示方式,可以在導(dǎo)航樹上創(chuàng)建及刪除數(shù)據(jù);也可以在三維視圖中進(jìn)行交互,方便地創(chuàng)建及修改模型。這種方式與GoF描述的Observer觀察者模式相似,即:

定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。

對(duì)應(yīng)上面的軟件,即對(duì)于唯一的數(shù)據(jù)源這個(gè)對(duì)象,導(dǎo)航樹及三維視圖都依賴于他。當(dāng)數(shù)據(jù)源這個(gè)對(duì)象中有數(shù)據(jù)的增刪改時(shí),導(dǎo)航樹及三維視圖都會(huì)得到通知并自動(dòng)更新了。

圖1右下角的CommandWindow中可以輸入命令,即PML,也可以對(duì)數(shù)據(jù)源進(jìn)行修改。引入Observer模式,即可實(shí)現(xiàn)這些功能。

Qt中包含了一系列的Model/View類,這些類都是基于MVC架構(gòu)的,這種將數(shù)據(jù)與視圖分開的處理,使同一個(gè)數(shù)據(jù)源可以不同的視圖中進(jìn)行展示,且不需要修改數(shù)據(jù)源的結(jié)構(gòu)。Qt中基于Command命令模式實(shí)現(xiàn)了一個(gè)Undo/Redo的框架,將Undo/Redo框架應(yīng)用于Model/View的類,即可得到與AVEVA Plant/PDMS中類似的功能。

本文主要對(duì)Qt中的model/view及undo/redo框架進(jìn)行介紹,及如何將Undo/Redo框架應(yīng)用到model/view中去,實(shí)現(xiàn)對(duì)以層次方式組織數(shù)據(jù)的樹模型進(jìn)行undo/redo,進(jìn)而實(shí)現(xiàn)一個(gè)三維CAD工廠設(shè)計(jì)的原型。

2.Tree Model

軟件中使用層次方式來(lái)組織數(shù)據(jù),可護(hù)展性好。如OpenCASCADE中的OCAF框架的數(shù)據(jù)也是樹形方式組織:

wps_clip_image-28088

Figure 2.1 OpenCASCADE OCAF data tree

每個(gè)Label中可以存放屬性,還包含子Label,這樣就提供了一個(gè)通用的程序框架,靈活使用,可以用一種統(tǒng)一的方式來(lái)存放數(shù)據(jù)。有一個(gè)缺點(diǎn)就是每個(gè)Label中的屬性類型只能包含一種,這種方式相對(duì)于AVEVA的自定義屬性UDA來(lái)說(shuō),就顯得很不方便了,需要提前對(duì)數(shù)據(jù)的存儲(chǔ)進(jìn)行規(guī)劃,擴(kuò)展起來(lái)稍有不便。

AVEVA中對(duì)每個(gè)數(shù)據(jù)Element都提供了自定義屬性(User Definable Attribute),每種類型的屬性(數(shù)值型、字符串型等)都可以包含任意數(shù)量,沒有限制。所以可擴(kuò)展性更好。

Qt中基于MVC模式的model/view架構(gòu)提供了一些預(yù)定義的模型及視圖,如列表模型及對(duì)應(yīng)的視圖,樹模型及樹視圖等。在model/view架構(gòu)中,為model提供了統(tǒng)一的訪問(wèn)數(shù)據(jù)的方式,即Model Index。對(duì)于列表model,通過(guò)QModelIndex::row()即可訪問(wèn)。對(duì)于表格model,需要QModelIndex::row()和QModelIndex::column()。對(duì)于樹model,除了上述兩個(gè)函數(shù),還需要提供QModelIndex::parent()來(lái)對(duì)父節(jié)點(diǎn)進(jìn)行訪問(wèn)。如下圖2.2所示:

wps_clip_image-11793

Figure 2.2 Schematic view of Qt’s Models

若需要對(duì)列表及表格model應(yīng)用Undo框架,還是很方便的,只要記住數(shù)據(jù)操作的對(duì)應(yīng)的row或row及column即可。若要對(duì)樹形model進(jìn)行undo,原理也是一樣的,即在redo中生成數(shù)據(jù)在undo中恢復(fù)數(shù)據(jù)。

3.Key Points

將undo框架與model/view結(jié)合有兩種方式:

v 通過(guò)在undo/redo命令中調(diào)用QAbstractItemModel的API來(lái)改變底層數(shù)據(jù);

v 自定義model使其創(chuàng)建命令并推送到undo棧Stack中去;

第一種方式看起來(lái)要容易些,且可與任意model結(jié)合。The first approach seems simpler, as it works with any model and gives the undo framework total control --- you can create as many different types of commands as you want and each of them can call a number of methods from the model API in their undo() and redo() routines.

當(dāng)model中有delete操作時(shí),會(huì)將index內(nèi)部的數(shù)據(jù)刪除。對(duì)于這種情況,需要注意。Qt給出了兩個(gè)解決辦法:

There are two things to remember. The first is that, if you delete items, rows or columns, you should save the data of all the items getting deleted(including children) somewhere so that you can later revert the deletion. The second is that it would be nice to be able to set meaningful descriptions of commands pushed on the stack. To do that you can provide methods in the model, that are called each time a command is pushed onto the stack, which should each return a description based on the parameters of the command being executed.

基于上述思想,實(shí)現(xiàn)了Tree Model與Undo Framework結(jié)合的一個(gè)小例子:

wps_clip_image-2472

Figure 3. Undo/Redo and Tree Model

4.Conclusion

Qt中基于Command命令模式的Undo框架,需要對(duì)數(shù)據(jù)操作及恢復(fù)仔細(xì)考量。尤其對(duì)于有刪除數(shù)據(jù)的操作,若以QModelIndex作為參考依據(jù),則會(huì)出錯(cuò)。對(duì)于此Qt提供了兩個(gè)解決思路。

基于Qt的model/view及undo框架,也可以方便實(shí)現(xiàn)OpenCASCADE中的OCAF框架許多類似的功能,且Qt的代碼可讀性更高。若要快速開發(fā)程序,可以考慮使用Qt的model/view框架。

感謝曉天的建議。

5. References

1. Using Undo/Redo with Item Views. http://doc.qt.digia.com/qq/qq25-undo.html

2. OpenCASCADE. OCAF User’s Guide. 2014

3. GoF. Design Patterns-Element of Reusable Object-Oriented Software. 1995

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品人人| 欧美高清视频一区| 国产一区二区三区在线观看免费视频| 欧美好骚综合网| 欧美激情欧美激情在线五月| 欧美精品成人| 国产精品毛片a∨一区二区三区|国| 国产精品久久| 激情五月***国产精品| 亚洲精品免费在线播放| 亚洲在线观看视频| 久久精品国产一区二区三| 免费在线亚洲| 99热免费精品| 久久久精品性| 欧美日韩国产成人在线观看| 国产精品一区免费观看| 一区二区在线视频观看| 中文精品视频一区二区在线观看| 欧美在线视频在线播放完整版免费观看 | 欧美体内谢she精2性欧美 | 国产精品人成在线观看免费| 国产一区二区剧情av在线| 在线观看一区视频| 亚洲女性喷水在线观看一区| 老鸭窝毛片一区二区三区| 日韩一级片网址| 久久久亚洲欧洲日产国码αv | 在线观看一区视频| 亚洲欧美日韩成人高清在线一区| 久久久久一区二区三区| aa日韩免费精品视频一| 美女诱惑黄网站一区| 国产精品性做久久久久久| 亚洲精品少妇30p| 久久免费99精品久久久久久| 日韩视频在线免费| 久久在线观看视频| 国产日韩欧美视频| 亚洲欧美自拍偷拍| 99在线|亚洲一区二区| 男人的天堂亚洲| 伊伊综合在线| 久久久久久久一区二区三区| 亚洲综合视频在线| 国产精品极品美女粉嫩高清在线 | 午夜国产精品视频免费体验区| 欧美日本一区二区高清播放视频| 一区二区视频在线观看| 久久精品视频免费播放| 亚洲伊人一本大道中文字幕| 欧美日韩在线亚洲一区蜜芽| aa级大片欧美三级| 亚洲人妖在线| 欧美电影免费观看大全| 亚洲福利视频一区二区| 免费中文日韩| 欧美成人a视频| 日韩一本二本av| 亚洲伦理久久| 欧美日韩亚洲综合一区| 亚洲丝袜av一区| 亚洲午夜精品在线| 国产精品欧美久久| 性视频1819p久久| 亚洲欧美日韩精品久久久| 国产美女精品视频| 久久久久久久综合| 另类激情亚洲| 一本色道久久88亚洲综合88| 9色精品在线| 国产精品网站在线播放| 欧美成人一区二区三区片免费| 久久精品视频在线播放| 国产精品毛片大码女人| 午夜欧美大尺度福利影院在线看| 日韩视频在线观看| 欧美日韩精品中文字幕| 日韩亚洲国产欧美| 夜夜嗨av一区二区三区| 国产精品女人网站| 久久久女女女女999久久| 老色批av在线精品| 亚洲精品一区二区三区樱花| 亚洲人成艺术| 国产精品男女猛烈高潮激情 | 欧美激情五月| 一本大道久久a久久综合婷婷| 99热在这里有精品免费| 国产精品捆绑调教| 欧美成人一品| 国产精品九九久久久久久久| 久久久青草婷婷精品综合日韩| 免费观看亚洲视频大全| 亚洲一区二区精品在线观看| 午夜精品久久久99热福利| 在线观看中文字幕亚洲| 99re6热只有精品免费观看| 国外精品视频| 亚洲天堂成人| 亚洲人精品午夜| 亚洲欧美成人网| 亚洲日本成人| 欧美专区在线观看| 亚洲自拍高清| 欧美高潮视频| 老司机午夜精品视频| 国产精品久久| 亚洲人成在线观看网站高清| 欧美天堂亚洲电影院在线播放| 99国产精品久久| 两个人的视频www国产精品| 一区二区三区久久| 久久免费99精品久久久久久| 亚洲在线播放电影| 麻豆91精品| 久久久夜色精品亚洲| 欧美日韩伦理在线| 亚洲国产色一区| 在线日韩av片| 欧美在线高清视频| 午夜在线电影亚洲一区| 欧美日韩在线视频首页| 亚洲精品乱码久久久久久蜜桃麻豆| 精品福利电影| 欧美一区二区成人6969| 欧美在线播放高清精品| 国产精品99免视看9| 国内精品久久久久久久97牛牛| 久久精品视频网| 久久亚洲综合色| 国产视频精品va久久久久久| 亚洲国产免费| 亚洲日本免费电影| 欧美jizz19hd性欧美| 欧美大尺度在线| 亚洲国产欧美一区| 你懂的亚洲视频| 亚洲娇小video精品| 亚洲精品久久久久久久久久久久久 | 亚洲经典自拍| 免费欧美网站| 玖玖玖国产精品| 亚洲午夜精品网| 麻豆九一精品爱看视频在线观看免费| 亚洲视频专区在线| 欧美日韩第一区日日骚| 亚洲国产91色在线| 99re8这里有精品热视频免费| 欧美理论在线| 一本一本久久a久久精品牛牛影视| 一本色道久久综合狠狠躁篇的优点| 欧美精品免费播放| 日韩视频在线你懂得| 午夜亚洲一区| 国产亚洲美州欧州综合国| 久久久亚洲精品一区二区三区| 欧美激情国产日韩| 亚洲性xxxx| 国内外成人在线| 欧美激情91| 亚洲欧美国产精品专区久久| 久久综合给合| 99re66热这里只有精品4| 国产精品男女猛烈高潮激情| 久久蜜臀精品av| 一本色道久久精品| 麻豆精品在线观看| 亚洲一区精品在线| 韩国欧美一区| 欧美日韩免费| 久久久噜噜噜久久狠狠50岁| 亚洲免费成人av电影| 久久久精品久久久久| aa日韩免费精品视频一| 黄色精品在线看| 欧美日韩免费高清| 久久先锋资源| 亚洲免费影视第一页| 亚洲国产综合在线| 久久久蜜桃精品| 新狼窝色av性久久久久久| 亚洲精品视频在线观看免费| 国产麻豆日韩欧美久久| 欧美另类久久久品| 久热爱精品视频线路一| 午夜免费日韩视频| a91a精品视频在线观看| 国产精品视频最多的网站| 欧美中文在线观看| 免费观看久久久4p| 欧美一区不卡| 亚洲午夜精品17c| 亚洲国产精品电影| 国内精品久久久久影院色| 国产精品人人爽人人做我的可爱| 欧美日韩国产不卡| 欧美日韩国产成人高清视频| 欧美电影电视剧在线观看| 免费观看久久久4p|