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

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

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

wps_clip_image-28934

Figure 1. AVEVA Plant/PDMS Software

如上圖1所示為英國劍橋大學CADCENTRE出品的AVEVA Plant/PDMS軟件。PDMS使用了統一的數據源,左邊的導航樹及右邊的三維模型都是這個數據源的一種展示方式,可以在導航樹上創建及刪除數據;也可以在三維視圖中進行交互,方便地創建及修改模型。這種方式與GoF描述的Observer觀察者模式相似,即:

定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。

對應上面的軟件,即對于唯一的數據源這個對象,導航樹及三維視圖都依賴于他。當數據源這個對象中有數據的增刪改時,導航樹及三維視圖都會得到通知并自動更新了。

圖1右下角的CommandWindow中可以輸入命令,即PML,也可以對數據源進行修改。引入Observer模式,即可實現這些功能。

Qt中包含了一系列的Model/View類,這些類都是基于MVC架構的,這種將數據與視圖分開的處理,使同一個數據源可以不同的視圖中進行展示,且不需要修改數據源的結構。Qt中基于Command命令模式實現了一個Undo/Redo的框架,將Undo/Redo框架應用于Model/View的類,即可得到與AVEVA Plant/PDMS中類似的功能。

本文主要對Qt中的model/view及undo/redo框架進行介紹,及如何將Undo/Redo框架應用到model/view中去,實現對以層次方式組織數據的樹模型進行undo/redo,進而實現一個三維CAD工廠設計的原型。

2.Tree Model

軟件中使用層次方式來組織數據,可護展性好。如OpenCASCADE中的OCAF框架的數據也是樹形方式組織:

wps_clip_image-28088

Figure 2.1 OpenCASCADE OCAF data tree

每個Label中可以存放屬性,還包含子Label,這樣就提供了一個通用的程序框架,靈活使用,可以用一種統一的方式來存放數據。有一個缺點就是每個Label中的屬性類型只能包含一種,這種方式相對于AVEVA的自定義屬性UDA來說,就顯得很不方便了,需要提前對數據的存儲進行規劃,擴展起來稍有不便。

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

Qt中基于MVC模式的model/view架構提供了一些預定義的模型及視圖,如列表模型及對應的視圖,樹模型及樹視圖等。在model/view架構中,為model提供了統一的訪問數據的方式,即Model Index。對于列表model,通過QModelIndex::row()即可訪問。對于表格model,需要QModelIndex::row()和QModelIndex::column()。對于樹model,除了上述兩個函數,還需要提供QModelIndex::parent()來對父節點進行訪問。如下圖2.2所示:

wps_clip_image-11793

Figure 2.2 Schematic view of Qt’s Models

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

3.Key Points

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

v 通過在undo/redo命令中調用QAbstractItemModel的API來改變底層數據;

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

第一種方式看起來要容易些,且可與任意model結合。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.

當model中有delete操作時,會將index內部的數據刪除。對于這種情況,需要注意。Qt給出了兩個解決辦法:

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.

基于上述思想,實現了Tree Model與Undo Framework結合的一個小例子:

wps_clip_image-2472

Figure 3. Undo/Redo and Tree Model

4.Conclusion

Qt中基于Command命令模式的Undo框架,需要對數據操作及恢復仔細考量。尤其對于有刪除數據的操作,若以QModelIndex作為參考依據,則會出錯。對于此Qt提供了兩個解決思路。

基于Qt的model/view及undo框架,也可以方便實現OpenCASCADE中的OCAF框架許多類似的功能,且Qt的代碼可讀性更高。若要快速開發程序,可以考慮使用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>
            久久激情婷婷| 亚洲一区二区精品视频| 亚洲图片欧美一区| 亚洲一品av免费观看| 亚洲一区影音先锋| 久久久久久久久一区二区| 免费视频最近日韩| 99国产精品久久久久久久久久 | 国产精品theporn88| 国产精品五区| 亚洲欧美春色| 久久蜜桃香蕉精品一区二区三区| 男人的天堂成人在线| 欧美激情亚洲一区| 国产精品午夜电影| 亚洲国产精品视频一区| 亚洲尤物在线视频观看| 免费成人av在线| 亚洲午夜在线视频| 欧美黄色一区二区| 国产主播一区二区三区| 一本色道久久99精品综合| 久久久99爱| 日韩一级网站| 蜜桃久久av| 国产一区二区av| 亚洲小说欧美另类婷婷| 欧美成年人在线观看| 亚洲欧美第一页| 欧美日韩精品高清| 亚洲国产精品久久久久秋霞影院| 香蕉av777xxx色综合一区| 欧美成人免费一级人片100| 国产精品99久久久久久宅男 | 亚洲欧美综合一区| 欧美金8天国| 一区国产精品| 久久se精品一区精品二区| 亚洲欧洲综合另类| 欧美在线观看你懂的| 国产精品国产福利国产秒拍| 亚洲精品男同| 亚洲韩国一区二区三区| 久久久xxx| 国产一区二区三区久久久久久久久| 亚洲视频在线免费观看| 亚洲国产精品久久久久婷婷老年 | 国产精品盗摄久久久| 亚洲美女av在线播放| 欧美激情91| 免费观看在线综合色| 1024亚洲| 亚洲电影免费| 欧美大片免费看| 亚洲精品一品区二品区三品区| 久久婷婷国产综合国色天香| 午夜精品福利电影| 国产午夜精品理论片a级探花| 欧美亚洲一区二区在线观看| 亚洲午夜一级| 国产视频观看一区| 鲁大师影院一区二区三区| 久久久夜精品| 亚洲精品视频一区| 亚洲靠逼com| 欧美性做爰猛烈叫床潮| 欧美一区二区三区视频在线观看| 久久久91精品国产一区二区三区 | 久久久蜜桃精品 | 国产丝袜美腿一区二区三区| 久久高清国产| 久久伊人一区二区| 亚洲美女黄色片| 中日韩美女免费视频网址在线观看 | 久久国产精品色婷婷| 精品动漫av| 亚洲成人在线视频播放 | 欧美一进一出视频| 尹人成人综合网| 91久久精品美女| 欧美午夜精品久久久久久超碰| 亚洲一二三区精品| 午夜精品视频在线观看一区二区| 国产一区二区三区在线播放免费观看 | 亚洲视频中文字幕| 韩日欧美一区| 亚洲日本在线观看| 国产日韩欧美中文在线播放| 免费久久99精品国产| 欧美日韩一区二区视频在线| 欧美在线日韩| 欧美精品99| 久久综合九色99| 欧美性jizz18性欧美| 你懂的视频欧美| 国产精品每日更新| 欧美激情视频免费观看| 国产精品久久久久永久免费观看 | 国产婷婷精品| 亚洲人成人99网站| 激情综合久久| 亚洲新中文字幕| 亚洲精品国产欧美| 久久国产婷婷国产香蕉| 亚洲伊人观看| 欧美精品日日鲁夜夜添| 美女网站久久| 国产欧美婷婷中文| 中文日韩在线| 在线视频免费在线观看一区二区| 久久综合狠狠综合久久综青草| 欧美激情一级片一区二区| 久久久精品动漫| 国产精品久久综合| 亚洲精品老司机| 亚洲国产精品一区二区www在线| 亚洲男人的天堂在线观看| 一区二区三区高清在线| 麻豆精品视频在线观看| 久久免费偷拍视频| 国产美女高潮久久白浆| 国产精品99久久久久久人| 一本色道久久88精品综合| 欧美电影美腿模特1979在线看| 老司机67194精品线观看| 国内不卡一区二区三区| 亚洲欧美日韩另类| 欧美一区二区精美| 国产精品免费看久久久香蕉| 99精品欧美一区二区三区综合在线 | 欧美一区二区三区播放老司机| 亚洲视频在线播放| 欧美日韩日本国产亚洲在线| 91久久精品一区二区别| 亚洲日本一区二区| 欧美精品v日韩精品v国产精品| 亚洲高清一区二区三区| 亚洲精品欧洲| 欧美日韩综合精品| 亚洲一区二区三区免费观看| 先锋影音网一区二区| 国产麻豆综合| 久久精品欧洲| 亚洲国产高清aⅴ视频| 亚洲国产一区二区a毛片| 欧美激情在线播放| 一区二区三区www| 欧美一级淫片aaaaaaa视频| 国产日韩在线亚洲字幕中文| 欧美一区二区在线播放| 免费观看一级特黄欧美大片| 亚洲美女电影在线| 国产精品久久久久久久久久ktv | 老司机一区二区三区| 在线看片成人| 欧美国产综合| 亚洲免费在线观看视频| 久久天天躁夜夜躁狠狠躁2022| 91久久精品国产91久久性色| 欧美日韩国产一级片| 亚洲在线免费观看| 欧美成人精品不卡视频在线观看 | 日韩网站在线看片你懂的| 亚洲与欧洲av电影| 韩国av一区二区三区四区| 欧美1区2区视频| 一区二区三区四区在线| 久久人体大胆视频| 亚洲一区在线免费观看| 好看的日韩视频| 欧美三区美女| 久久三级视频| 久久国产精品久久久久久久久久 | 99精品国产在热久久下载| 国产精品久久久久久久久免费| 久久精品成人一区二区三区| 最新亚洲电影| 久久男人av资源网站| 亚洲香蕉网站| 亚洲精品乱码久久久久久| 国产日韩精品在线| 欧美日韩国产综合久久| 久久九九精品99国产精品| 99精品国产在热久久婷婷| 免费视频亚洲| 久久久久免费视频| 午夜视频一区二区| 一区二区三区免费看| 最近中文字幕日韩精品| 国产一区视频网站| 国产精品区一区二区三| 欧美黄色片免费观看| 可以看av的网站久久看| 欧美有码在线观看视频| 亚洲一级电影| 一区二区电影免费在线观看| 亚洲欧洲一级| 亚洲人成在线免费观看| 亚洲国产日韩欧美综合久久| 久久五月婷婷丁香社区|