于凱華 李華龍
摘要:本文簡(jiǎn)述了利用QtDesigner插件機(jī)制二次開(kāi)發(fā)簡(jiǎn)易組態(tài)工具,顯示自定義控件及配置控件屬性,完成控件顯示及屬性配置界面。
關(guān)鍵詞:Qt;Designer;插件開(kāi)發(fā)
中圖分類(lèi)號(hào):TP271 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)12-0293-02
為了快速開(kāi)發(fā)一款簡(jiǎn)易組態(tài)工具,完成嵌入式儀器設(shè)備操作界面組態(tài)控制功能,采用基于Qt開(kāi)發(fā)的一款交互式可視化GUI設(shè)計(jì)開(kāi)源軟件工具Designer,并根據(jù)項(xiàng)目需求,對(duì)其控件功能進(jìn)行二次開(kāi)發(fā)。
采用Qt Designer作為二次開(kāi)發(fā)的工具,主要是因?yàn)镼t是一個(gè)跨平臺(tái)的開(kāi)源C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架,支持的操作系統(tǒng)包括: Microsoft Windows7,Linux,F(xiàn)reeBSD,BSD/OS等等。而且Qt 具有良好的封裝機(jī)制,其模塊化程度非常高,可重用性較好,還提供了豐富的API,對(duì)軟件開(kāi)發(fā)來(lái)說(shuō)非常方便。采用的Qt Designer版本是基于Qt4.7.4庫(kù)版本開(kāi)發(fā)的。
1前言
Qt Designer基于插件的架構(gòu)允許用戶自定義和第三方的自定義窗口控件進(jìn)行編輯,包括控件屬性,控件動(dòng)作等。但是Qt Designer本身是面向軟件開(kāi)發(fā)人員進(jìn)行功能界面設(shè)計(jì)及代碼開(kāi)發(fā)的,并不適用于無(wú)軟件開(kāi)發(fā)基礎(chǔ)的工程組態(tài)人員,因此進(jìn)行二次開(kāi)發(fā),對(duì)其控件顯示及屬性配置進(jìn)行了重新開(kāi)發(fā)及封裝,實(shí)現(xiàn)簡(jiǎn)易的組態(tài)軟件。工程人員利用該組態(tài)軟件進(jìn)行控制邏輯設(shè)計(jì)及組態(tài),并保存成二進(jìn)制文件,用于嵌入式儀器設(shè)備加載顯示組態(tài)界面并進(jìn)行邏輯操作。
插件二次開(kāi)發(fā)是該組態(tài)軟件的重要部分,主要包括以下幾個(gè)方面。
2插件接口類(lèi)實(shí)現(xiàn)
Qt Designer提供了插件接口類(lèi)QDesignerCustomWidgetInterface及加載插件類(lèi)的方法,為復(fù)用其插件加載機(jī)制,自定義設(shè)計(jì)的插件必須繼承于該接口類(lèi),保證軟件啟動(dòng)后可以順利加載自定義開(kāi)發(fā)的插件。接口類(lèi)中的成員函數(shù)描述了部件暴露的各種屬性,其大多數(shù)是由基類(lèi)中的純虛函數(shù)提供的。子類(lèi)需重新實(shí)現(xiàn)的函數(shù)如下表所示:
3插件控件類(lèi)實(shí)現(xiàn)
Qt Designer軟件中插件的控件類(lèi)默認(rèn)繼承于QWidget,其包含了眾多屬性項(xiàng)配置,而絕大多數(shù)并不適用于工程組態(tài)人員進(jìn)行配置,工程人員更傾向于使用屬性項(xiàng)配置簡(jiǎn)單的組態(tài)控件,能滿足工程顯示要求即可。因此對(duì)Qt Designer控件進(jìn)行二次開(kāi)發(fā),設(shè)計(jì)繼承于QWidget的控件基類(lèi)HmiWidget,并設(shè)計(jì)自定義屬性數(shù)據(jù)結(jié)構(gòu)HmiProperty,用于存儲(chǔ)自定義控件的屬性項(xiàng)及屬性值。
HmiWidget控件基類(lèi)主要實(shí)現(xiàn)以下功能:
基類(lèi)HmiWidget中封裝自定義控件的基本屬性,包括控件坐標(biāo)、長(zhǎng)度、寬度、可見(jiàn)性、可用性、偏移位置等信息。繼承于該基類(lèi)的子控件則實(shí)現(xiàn)自定義的屬性,以自定義按鈕控件為例,添加自定義屬性,包括按鈕文本、文本顏色、字體大小、安全級(jí)別等等。該設(shè)計(jì)方案易于擴(kuò)展控件功能,提高代碼的復(fù)用性,避免代碼的重復(fù)開(kāi)發(fā)工作;根據(jù)不同項(xiàng)目需求,快速完成控件開(kāi)發(fā)。
自定義屬性數(shù)據(jù)結(jié)構(gòu)HmiProerty用于存儲(chǔ)自定義控件的屬性類(lèi)型及屬性值,Qt Designer插件加載時(shí)獲取控件屬性會(huì)強(qiáng)制轉(zhuǎn)換為QVariant數(shù)據(jù)結(jié)構(gòu),QVariant是Qt提供的通用數(shù)據(jù)類(lèi)型,支持C++所有的標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型,同樣支持自定義數(shù)據(jù)類(lèi)型,為保證自定義數(shù)據(jù)類(lèi)型HmiProperty可以被Qt Designer識(shí)別,可以通過(guò)Qt提供的宏Q_DECLARE_METATYPE()將HmiProperty注冊(cè)到QVariant中,保證屬性加載過(guò)程中可以識(shí)別自定義書(shū)記類(lèi)型。
4自定義屬性加載
Qt Designer加載顯示控件屬性是通過(guò)QObject提供的屬性獲取接口函數(shù),獲取控件的所有屬性,不僅包括控件本身的屬性項(xiàng),同樣包括基類(lèi)QWidget的屬性項(xiàng)。而實(shí)際組態(tài)過(guò)程中只需顯示工程人員需要配置的屬性項(xiàng)即可,因此對(duì)Qt Designer屬性加載過(guò)程中的屬性處理機(jī)制進(jìn)行裁剪處理。主要包括兩個(gè)部分:
? 對(duì)自定義控件進(jìn)行類(lèi)型判定,Qt的元對(duì)象系統(tǒng)提供了實(shí)時(shí)類(lèi)型信息獲取機(jī)制,這保證通過(guò)Qt提供的函數(shù)獲取創(chuàng)建的控件對(duì)象的實(shí)際對(duì)象類(lèi)型。判斷控件類(lèi)型是否是繼承于HmiWidget,若是,則證明該控件屬于組態(tài)工具要加載的對(duì)象,否則直接返回不予處理,避免加載Qt原生的控件對(duì)象。
? 自定義控件屬性項(xiàng)加載,同樣借助于Qt元對(duì)象系統(tǒng),獲取自定義控件的屬性項(xiàng),進(jìn)行類(lèi)型判斷,查看屬性項(xiàng)對(duì)象是否繼承于HmiProperty,若是,則添加到顯示屬性類(lèi)表中,否則直接返回,不予處理。最終將控件顯示屬性列表中的屬性項(xiàng)加載到屬性配置窗口中進(jìn)行顯示。
5結(jié)束語(yǔ)
自定義插件創(chuàng)建完成后,運(yùn)行Qt Designer軟件,顯示控件窗口及屬性配置窗口如下圖所示。
基于Qt Designer插件機(jī)制二次開(kāi)發(fā)的簡(jiǎn)易組態(tài)軟件,滿足工程組態(tài)人員組態(tài)要求,將工程組態(tài)人員組態(tài)的畫(huà)面最終保存成二進(jìn)制文件,下裝到嵌入式儀器控制系統(tǒng)中,界面顯示正常,操作動(dòng)作正確執(zhí)行,滿足工程要求。
【通聯(lián)編輯:梁書(shū)】