3DSlicer20:GUI Structure
生活随笔
收集整理的這篇文章主要介紹了
3DSlicer20:GUI Structure
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.前言
Slicer在Version4之前,GUI使用Kitware公司的GUI工具KWWidget開發,KWWidget不支持Unicode。而Slicer的最新Version4使用了Nokia公司的Qt代替KWWidget進行開發。2.Slicer界面結構
Slicer應用程序的結構由應用程序核心、Slicer模塊組成。 應用程序核心部分實現Slicer用戶界面,提供數據輸入-輸出接口、可視化、拓展應用程序開發界面等。 Slicer模塊在整個應用程序中的功能是提供圖像處理算法,其輸入一般是未經處理的二維/三維圖像數據,經過模塊提供的圖像處理算法處理后輸出。2.1 核心部分
核心部分包括:Slicer的主菜單、工具欄、設置界面、三維視圖界面、三個切片視圖及其他們的控制界面。Slicer的應用程序界面如上圖所示。
2.2 模塊部分
包含所有的模塊界面,分為三類:可加載模塊、命令行模塊、腳本模塊。- 可加載模塊界面豐富也很復雜,因為可加載模塊的界面元素由UI文件直接定義。
3.Slicer平臺界面創建過程研究
由上可知Slicer平臺界面由兩大部分組成。其中對于模塊部分,三種模塊之間也是有區別的,造成這種區別的根本原因是程序創建界面的過程不同。3.1 核心部分
核心部分界面就是主窗口,主要包括主菜單、工具欄、設置界面、三維視圖界面、切片視圖及其控制界面。- 主菜單在創建主窗口的UI文件中創建,采用Qt Designer生成的界面文件。當構建工程時,編譯器依賴Qt4的用戶界面轉換器UIC(UI Converter)將Qt Designer生成的UI文件轉換成固定格式的C/C++頭文件,這個頭文件包含了一個SetupUi()和retranslateUi()方法,分別用于生成GUI界面和設置界面語言,工程中的其他文件,只要把這個頭文件包含進來,冰球低啊用SetupUi()方法,就可以使用這個UI文件。
- 工具欄部件在源代碼中直接創建,之后添加到主窗口。定義Slicer工具欄的類繼承于Qt,并且在Slicer中對這個類的功能進行改進,之后再對這個預留的部件進行修改。工具欄的名稱使用Qt方法進行添加。
- 設置界面(Setting)的創建和主菜單非常的類似,都是采用UI文件幫助完成的,Setting面板有多個區域,有界面左側的菜單進行選擇。如Module Setting用于設置模塊加載與否,拓展添加等。需要注意的是,設置界面在程序創建主應用對象qSlicerApplication app(argc,argv)的過程中創建,要十分注意之原文件加載的位置。
- 三維視圖界面/切片視圖/控制界面很大一部分內容也是有UI文件創建,但是在添加到Slicer之前做了部分的修改。
3.2 模塊框架
所有的模塊包含“Help & Acknowledgement”文本框的界面框架,用于顯示模塊相關信息,如模塊功能、開發者、教程等。這個界面框架也是采用Qt進行創建的,創建完成之后,再根據模塊類型的不同添加其他界面。主窗口只需要將這個界面框架添加就能完成所有的模塊界面的集成。 界面框架在Slicer中被稱為qSlicerModulePanel,它與模塊分類界面的關系如下圖:
引用:曾文曄_浙江工業大學
3.3 可加載模塊分類界面
可加載模塊界面是一種使用C++開發的模塊,針對每個模塊的功能,開發了特定的圖形用戶界面。因此所有這種模塊的分類界面的創建的核心部分類似,同樣是采用Qt Designer進行設計。注釋模塊就是可加載模塊中的代表。 需要注意的是,部分可加載模塊的界面還使用了一些由CTK庫中定義的窗口部件,CTK是以提供應用程序級別的DICOM支持、插件框架、專門的GUI部件為重點的生物醫學圖像運算庫。
3.4 命令行模塊分類界面
所有命令行模塊的分類界面的格式都是完全統一的,qSlicerCLIModuleWidget。下圖是Add Scalar Module模塊的分類界面部分:注意到,該界面也是由UI文件創建(Qt Designer),再在其中添加窗口部件實現整體界面。該界面UI文件已經包含了“parameter set”標簽、下拉菜單和底部的四個按鈕。
但是模塊的狀態顯示欄和參數界面,是在其他源代碼中創建完畢后添加的。
- 模塊狀態顯示欄用于顯示圖像處理狀態,通過調用VTK庫中的方法來實現,在工程qSlicerBaseQTCLI中的qSlicerCLIProgressBar.cxx文件中定義。
- 參數界面取決于不同的命令行模塊參數。這些命令行模塊參數由模塊的XML文件給出。
?程序在編譯創建命令行模塊的過程中,利用到了外部組件SlicerExecutionModel,它為程序提供GenerateCLP.exe工具和庫ModuleDescriptionParser。前者用來在編譯過程中處理XML文件,從XML文件產生固定內容的頭文件,這個頭文件中的一個字符串變量包含了XML中的所有信息。后者提供了一個類,將這個字符串變量中包含的字符串分析,并且存儲在這個類的對象的屬性中等待調用。
=============================================================================== 命令行模塊分類界面框架在源文件qSlicerCLIModuleWidget.cxx中的qSlicerCLIModuleWidgetPrivate: : setupUi()函數完成創建,首先調用Ui_qSlicerCLIModuleWidget: setupUi()函數來創建一個原始的界面,這個原始界面包含了程序狀態顯示欄和一些按鈕。
然后再通過函數addParameterGroups()將模塊的所有參數界面添加到這個原始界面中去。addParameterGroups()函數通過循環,將所有參數以及參數下面的具體項目分層次的全部添加到界面。
3.5 腳本模塊分類界面
嵌入到模塊界面框架的Python腳本模塊分類界面使用Python腳本語言開發,這也正是這類模塊的名稱由來。腳本模塊通過調用Python封裝的VTK, ITK, ?Qt等庫的API來實現模塊的功能,界面也通過類似方法來實現創建。Python腳本模塊分類界面的創建過程類似于可加載模塊,其不同之處在于編寫的語言有所不同。Slicer集成Python解析器,Slicer大部分API都在Python中被封裝。程序可以對腳本模塊(Scripted Modules)的PY文件進行解析執行。復雜的交互模塊可以完全通過Python來調用使用Pyhton封裝的C++的方法來進行編寫(例如:Endoscopy,Editor,SampleData,ChangeTracker等),即直接調用Qt的類來創建界面,調用VTK, ITK等實現模塊的功能。以下是用Python語言編寫的一個名為“Hello world”的按鈕。
helloWorldButton = Qt.QPushButton("HelloWorld"); //創建按鈕 賦予名稱 helloWorldButton.toolTip = "Print 'HelloWorld' "; ?//賦予按鈕提示信息 sampleFormLayout.addWidget(helloWorldButton); //將按鈕加入到界面中 helloWorldButton.connect('clicked(bool)',self.onHelloWorld Button Clicked); //按鈕功能和觸發方式
總結
以上是生活随笔為你收集整理的3DSlicer20:GUI Structure的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3个月的SHELLCODE研究成果-一个
- 下一篇: Win32 进程间示例代码 Proces