新軟件控件的寫法_第1頁
新軟件控件的寫法_第2頁
新軟件控件的寫法_第3頁
新軟件控件的寫法_第4頁
新軟件控件的寫法_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、控件繪制的大致思路:在一個控件工程里,首先是有個pro文件,pro文件里配置了將控件工程生成的dll文件是復(fù) 制到re lease還是debug里的modules文件夾里。組態(tài)軟件一運(yùn)行就依次掃描modules文件里 的文件,將這些文件注冊到組態(tài)環(huán)境,這樣控件裝載到組態(tài)環(huán)境中pro文件里也列出了所 有的頭文件和源文件,源文件一般有至少一個c文件和兩個cpp文件。控件的使用有兩種情 況,一:用于組態(tài)工程離線模擬;二:用于組態(tài)環(huán)境的裝載。這兩種情況是共用一段繪制代 碼,這段繪制代碼我們放在c文件,由于QT自帶的繪制函數(shù)不能適用于離線模擬,所以繪 制代碼里用到的繪制函數(shù)都是自己編寫提供的,同時在c文

2、件里也需要調(diào)用module_init和 module_exit來實現(xiàn)離線模擬時的控件注冊,而兩個cpp文件是用于組態(tài)環(huán)境的控件裝載。 頭文件主要就是用于函數(shù)和類結(jié)構(gòu)的聲明??丶陔x線模擬情況下的實現(xiàn)主要是通過module_init和module_exit這兩個函數(shù)。_declspec(dllexport) int module_init(char *params)line_init();return 1;模塊初始化函數(shù)并導(dǎo)出模塊,運(yùn)行程序一運(yùn)行,程序就開始搜索這些模塊,而這個函數(shù)的實 現(xiàn)是一個初始化函數(shù),而line_init ()這個函數(shù)是將這個控件(直線)注冊到這個運(yùn)行程序 中。_decls

3、pec(dllexport) void module_exit()模塊退出函數(shù),運(yùn)行系統(tǒng)退出時將自動調(diào)用該函數(shù)。以直線控件為例,控件在組態(tài)環(huán)境的中的實現(xiàn)實際上是通過 Q_EXPORT_PLUGIN2(customwidgetplugin, LinePlugin)這個函數(shù),將控件注冊到組態(tài)環(huán)境中, 這里的 LinePlugin 就是一個插件類,其中 LinePlugin 繼承于 QDesignerCustomWidgetInterface(Qt內(nèi)部的類)。class QDesignerCustomWidgetInterfacepublic:virtual QDesignerCustomWidge

4、tInterface() virtual QString name() const = 0;virtual QString group() const = 0;virtual QString toolTip() const = 0;virtual QString whatsThis() const = 0;virtual QString displayName() const = 0;virtual QIcon icon() const = 0;virtual bool isContainer() const = 0;virtual QWidget *createWidget(QWidget

5、*parent) = 0;virtual bool isInitialized() const return false; virtual void initialize(QDesignerFormEditorInterface *core) Q_UNUSED(core); virtual QString domXml() constreturn QString:fromUtf8() .arg(name().arg(name().toLower();這個類里的成員函數(shù)都是純虛函數(shù),而這些純虛函數(shù)的實現(xiàn)留給該類的派生類去做,方便使用了多態(tài)特性。LinePlugin就是一個一個的實現(xiàn)上面的函數(shù)。n

6、ame():表示控件的名字;group():表示這個控件屬于控件箱哪個組,例如直線就屬于基本控件,xy曲線屬于趨勢曲線。toolTip():表示這個控件的工具提示;whatThis():表示這個控件的信息;displayName():表示這個控件在控件箱里的顯示名字;icon():表示這個控件在控件箱里的顯示圖片;isContainer():表示這個控件是否是容器類的;creatWidget(QWidget *parent):創(chuàng)建一個窗口,即調(diào)用了一個類,這個類包含了控件的屬性、 畫法。isInitialized():是否初始化;initialize(QDesignerFormEditorIn

7、terface *core):控件被初始化;domXml():指出了這個控件信息保存為xml格式的寫法;四.上面提到的creatWidget(QWidget *parent)的實現(xiàn)是調(diào)用了一個類,這個類(以直線控件 為例,這個類是line)繼承于QhmiWidgeto QhmiWidget類提供了關(guān)于控件屬性相關(guān)的 一些函數(shù),這些函數(shù)如下所示:void addProperty(QString name, QString caption, QString group, QString saveType, QVariant value,bool isDynamicProp=true);給控件添加單

8、一屬性值的屬性,其中name是用于保存到xml文件里;caption是用于在軟件 中屬性列表里顯示的;group是指這個屬性放到屬性列表里哪個屬性組里;saveType是指這 個屬性的數(shù)據(jù)類型,例如字符串型、無符號長整型等,也是用于保存到xml文件中的;value 是屬性值,可以是具體的數(shù)值,也可以是Qcolor; isDynamicProp是指這個屬性是否支持動 態(tài)屬性。void addProperty(QString name, QString caption, QString group, QString saveType, QStringList keys ,int baseIndex

9、 =0, int defaultIndex = 0,bool isDynamicProp=true);給控件添加一個多屬性值的屬性,其中name,caption,group,saveType,isDynamicProp的含義 跟函數(shù)1是一樣的,keys是所有屬性值的列表,baseIndex表示這個屬性值列表的索引的起 始值,defaultIndex表示這個屬性值表的默認(rèn)索引。例如:QStringList items;items.append(tr(nLeftTop to RightBottom);items.append(tr(LeftBottom to RightTop);addProper

10、ty(direction, tr(Direction), tr(Ltne), ulong, items,1,0);這個Direction的屬性,初始顯示為LeftTop to Rig先tBottom,保存到xml的value= 1,當(dāng)選擇為 LeftBottom to Rig龍tTop,保存到 xml 的 value=2。void addProperty(QString name, QString caption, QString group, QStringList keys ,bool isDynamicProp=true);給控件添加一個多屬性值的屬性。virtual bool save

11、Property(QXmlStreamWriter &writer, QString propertyName);將控件的當(dāng)前的屬性值和其他屬性信息保存到xml文件中,write是一個xml文件的指針, propertyName是屬性名,我們一般的寫法為:bool line:saveProperty(QXmlStreamWriter &writer, QStringpropertyName)return false;但是有一些情況,例如軟鍵盤里有一個font (字體大小)的屬性是個多屬性值的,用戶想要 保存的是當(dāng)前的具體的字體大小值,而不是屬性值的當(dāng)前索引。我們就要把這個函數(shù)的實現(xiàn) 進(jìn)行修改:

12、bool numkeyboard:saveProperty(QXmlStreamWriter &writer, QString propertyName)f (propertyName = keyfontsize)saveFontSizeProperty(writer, propertyName);return true;if(propertyName = editboxfontsize)saveFontSizeProperty(writer, propertyName);return true;return false;virtual bool loadProperty(const QStr

13、ing &propertyName,const QString &type,const QString &length,const QString &value);裝載控件的屬性。將控件的屬性名,數(shù)據(jù)類型,長度,屬性值裝載到屬性列表中。一般的寫 法為:bool line:loadProperty(const QString &propertyName,const QString &type,const QString &length,const QString &value)return false;但對于像軟鍵盤的那種字體大小的屬性裝載,函數(shù)的實現(xiàn)如下:bool numkeyboard:lo

14、adProperty(const QString &propertyName,const QString &type,constQString &length,const QString &value)if (propertyName = keyfontsize)loadFontSizeProperty(propertyName, value);return true;if(propertyName = editboxfontsize)loadFontSizeProperty(propertyName, value);return true;return false;void getPrope

15、rtyValue(QString name,QVriant &value);void getPropertyValue(QString name,int &value);void getPropertyValue(QString name,QColor &color);void getPropertyValue(QString name,unsigned int &value);void getPropertyValue(QString name,QByteArray &value);void getPropertyValue(QString namefloat &value);void ge

16、tPropertyValue(QString name,QString &value);void getPropertyValue(QString name,QFont &value);void getPropertyValue(QString name9QStringList &value);通過屬性名name得到屬性值value或者是顏色color0setPropertyValue(QString name,const QVariant &value);根據(jù)vlaue得到屬性名name的屬性值并設(shè)置。virtual void Init();控件初始化。給控件添加事件,如果控件的事件不是默認(rèn)

17、的“按下時”和“釋放時”事件, 需要將這個函數(shù)進(jìn)行重載。void addEvent(QString name, QString caption, QString code);如果控件的事件不是默認(rèn)的“按下時”和“釋放時”事件,就需要在控件里添加事件,重新 實現(xiàn)Init(),在這個函數(shù)內(nèi)添加事件。例如定時器里void timer:Init()addEvent(timer,tr(timer),);void addVarProperty(QString name, QString caption, QString group, QString value,bool isDynamicProp=tru

18、e);添加變量屬性,可以關(guān)聯(lián)數(shù)據(jù)庫里的變量,name是用于保存到xml文件里;caption是用于 在軟件中屬性列表里顯示的;group是指這個屬性放到屬性列表里哪個屬性組里;value是所 關(guān)聯(lián)的實施數(shù)據(jù)庫里的數(shù)據(jù)名。void addFileProperty(QString name, QString caption, QString group, QString value,bool isDynamicProp=true);添加文件屬性,是將外部的文件添加到工程中,屬性值是文件名。例如圖片控件的文件 名:addFileProperty(filename, tr(filename), tr(

19、picture), , 1);void addDisplayFieldProperty(QString name, QString caption, QString group, int kind, QStringList allField, QStringList selectedField, bool isDynamicProp);添加顯示欄屬性,這個主要用于標(biāo)題欄的文本顯示,例如報警窗口和歷史數(shù)據(jù)列表的標(biāo)題欄 的文本顯示。name,caption,group,isDynamicProp的含義跟函數(shù)1 一樣;kind是用來標(biāo)識這個 標(biāo)題欄是屬于報警窗口的還是屬于歷史列表窗口的,0表示是報警

20、窗口,1表示是歷史列表 窗口; allfieled表示所有的標(biāo)題欄文本;selectedField表示被選擇的標(biāo)題欄文本。unsigned int getFontSize(QString propertyName);這個函數(shù)用于得到字體大小。propertyName是屬性名,返回值就是字體的大小。int getFontIndex(QString propertyName, const QString &value);這個函數(shù)通過屬性名propertyName和xml文件中保存的value值得到這個value的當(dāng)前索引 值。void saveFontSizeProperty(QXmlStream

21、Writer &writer, QStringpropertyName); void loadFontSizeProperty(QString propertyName, const QString &value);這兩個函數(shù)在前面函數(shù)4和函數(shù)5里分別有使用過,saveFontSizeProperty是用于保存字 體大小的屬性, loadFontSizeProperty 用于裝載字體大小的屬性。void writeDomProperty(QXmlStreamWriter &writer, QString propertyName, QString type, QString value, in

22、t length = 0);當(dāng)控件的屬性不能使用默認(rèn)的方法保存下來,就可以使用這個函數(shù)將屬性保存到xml文件 中,propertyName屬性名;type屬性值的數(shù)據(jù)類型;value屬性值;length屬性值的長度。例如bemtext里保存字體寬度時,int winFontWeight = 400;if (qtFontWeight = QFont:Normal)winFontWeight = 400;else if (qtFontWeight = QFont:Bold) winFontWeight = 700;writeDomProperty(writer, fontweight, long,

23、 QString:number(winFontWeight);line這個類的具體實現(xiàn),在實例函數(shù)中添加控件的屬性;實現(xiàn)saveProperty和loadProperty 函數(shù);根據(jù)控件屬性將控件繪制出來,調(diào)用的void paintEvent(QPaintEvent * /* event */)這個 函數(shù)。五.控件的繪制沒有直接調(diào)用Qt里自帶的函數(shù),而是自己編寫的函數(shù),下面是控件繪制里用到的函數(shù)和一些類。對于比較復(fù)雜的控件,我們可以把控件的所有屬性作為一個結(jié)構(gòu)體的成員來處理。在函 數(shù)中用到的屬性,我們直接定義它的一個結(jié)構(gòu)體就行了。繪制控件的一些結(jié)構(gòu)體函數(shù):2.1typedef struct _

24、hmi_rec_tshort left;short top;short right;short bottom;hmi_rect_t;這個結(jié)構(gòu)體是指我們在畫面上放置控件時所拉出的那個矩形。typedef struct _hmi_color_tu8 r;u8 g;u8 b;u8 reserved;hmi_color_t;是指顏色的RGB值;typedef struct _hmi_point_tint x;int y;hmi_point_t;是指畫面上(x,y)的點。int hmi_gui_ellipse(void *gui, int left, int top, int right, int bo

25、ttom, hmi_color_t *edgecolor, hmi_color_t *fillcolor);繪制橢圓int hmi_gui_rectangle(void *gui, int left, int top, int right, int bottom, hmi_color_t*edgecolor, hmi_color_t *fiUcolor);繪制矩形框gui是指定了窗口和畫筆;left,top,right,bottom是所畫圖形的范圍;edgecolor是橢圓邊緣顏色;fillcolor是橢圓填充顏色,返回值1表示成功,0表示失敗。int hmi_gui_pixel(void *

26、gui,int x,int y,hmi_color_t *color);繪制一個像素點,通過x,y確定點的位置,color為這個點的顏色,返回值1表示成功,0表 示失敗。int hmi_gui_line(void *gui, intxbeg, intybeg, intxend, intyend, int Hne_width, int style, hmi_color_t *color);繪制直線,通過xbeg,ybeg,xend,yend來確定線的起始和終止位置,line_width表示直線的寬度, color為直線的顏色,返回值1表示成功,0表示失敗。Style有以下幾種:#defne LI

27、NE_STYLE_SOLID1表示實線#define LINE_STYLE_DOT2表示點線#define LINE_STYLE_DASH 3 表示虛線int hmi_gui_text(void *gui, int xstart, int ystart int xend, int yend char *str, int length, hmi_color_t *color, int format);繪制文本,xstart,ystart,xend,yend表示文本所占位置,str為文本內(nèi)容,length為文本長度, color為文本顏色,format為文本格式,返回值1表示成功,0表示失敗。fo

28、rmat有一下幾種:#define TEXT_ALIGN_LEFT0 x01表示居左#define TEXT_ALIGN_RIGHT0 x02表示居右#define TEXT_ALIGN_CENTER0 x03表示居中#define TEXT_ALIGN_VCENTER0 x04表示垂直居中#define TEXT_ALIGN_HMASK0 x03int hmi_gui_gradtriangle(void *gui, int left, int top, int right, int bottom, hmi_color_t *start_color, hmi_color_t *end_colo

29、r, u32 direction);繪制漸進(jìn)三角形。void hmi_gui_gradrectangle(void *gui, int left, int top, int right, int bottom, hmi_color_t *start_color, hmi_color_t *end_color, u32 direction);繪制漸進(jìn)矩形。int hmi_gui_gradeUipse(void *gui, int left, int top, int right, int bottom, hmi_color_t *start_color, hmi_color_t *end_col

30、or, u32 direction);繪制漸進(jìn)橢圓形。left,top,right,bottom規(guī)定了所繪制漸進(jìn)圖形的范圍,start_color為漸進(jìn)起始顏色,end_color 為漸進(jìn)結(jié)束顏色,direction為漸進(jìn)圖形的方向。返回值1表示成功,0表示失敗。漸進(jìn)三角形direction有以下幾種情況:#define TRIANGLE_TOP_HORIZION#define TRIANGLE_BOTTOM_HORIZION#define TRIANGLE_RIGHT_VERTICAL#define TRIANGLE_LEFT_VERTICAL漸進(jìn)三角形drection有以下幾種情況:#de

31、fine RECTANGLE_MIDDLE_HORIZION#define RECTANGLE_MIDDLE_VERTICAL#define RECTANGLE_LEFT_RIGHT#define RECTANGLE_RIGHT_LEFT#define RECTANGLE_SIDE_HORIZION#define RECTANGLE_SIDE_VERTICAL#define RECTANGLE_TOP_BOTTOM#define RECTANGLE_BOTTOM_TOP#define RECTANGLE_RBOTTOM_LTOP#define RECTANGLE_LBOTTOM_RTOP#de

32、fine RECTANGLE_LTOP_RBOTTOM#define RECTANGLE_RTOP_LBOTTOM#define RECTANGLE_M_LTOP_RBOTTOM#define RECTANGLE_LTOP_RBOTTOM_M#define RECTANGLE_M_LBOTTOM_RTOP表示漸進(jìn)三角形朝上表示漸進(jìn)三角形朝下表示漸進(jìn)三角形朝右表示漸進(jìn)三角形朝左0 x20表示水平中間到兩邊0 x21表示垂直中間到兩邊0 x22表示從左到右0X23表示從右到左0X24表示水平兩邊到中間0X25表示垂直兩邊到中間0X26表示上到下0X27表示下到上0X28,表示右下到左上0X29表示

33、左下到右上0 x2a表示左上到右下0 x2 b表示右上到左下0 x2 c表示中間左上右下0 x2d表示左上右下到中間0 x2e表示中間左下右上0 x2f表示左下右上到中間1234#define RECTANGLE_LBOTTOM_RTOP_M漸進(jìn)橢圓direction有以下幾種情況:#define ELLIPSE_MIDDLE_HORIZION#define ELLIPSE_MIDDLE_VERTICAL#define ELLIPSE_CENTER0 x00 x10 x2水平中心到兩邊垂直中心到兩邊表示中心到邊緣void hmi_gui_set_co!or(hmi_color_t *color

34、, u8 r, u8 g ,u8 b);設(shè)置顏色。將r,g,b值設(shè)置到co lor中的r,g,b中。void hmi_gui_set_rect(hmi_rect_t *rect, short left, short top, short right, short bottom);將 rect 的 left,top,right,bottom 設(shè)置為入?yún)⒗锏?left, top, right, bottom 的值。2.9關(guān)于圖片的函數(shù)int hmi_gui_pic_file(void *gui, int left, int top, int right, int bottom, char file

35、name, int transparent, hmi_color_t *transparent_color);繪制出加載的外部圖片文件,left,top,right,bottom是圖片所在圖紙上的范圍,filename為圖 片文件名,transparent表示圖片是否采用透明方式,transparent_color為透明顏色。返回值1 表示成功,0表示失敗。也可以把這個函數(shù)完成的功能分成下面的三個函數(shù)共同完成。void *hmi_gui_loadpic(char filename);加載圖片名為filename的圖片文件,這個函數(shù)返回一個void*的指針,指針指向了一個內(nèi)部 用的數(shù)據(jù)結(jié)構(gòu),用于

36、保存加載的一些信息。void hmi_gui_unloadpic(void *pic);函數(shù)是用來釋放由hmi_gui_loadpic分配的資源的。int hmi_gui_pic(void *gui, int left, int top, int right, int bottom, void *pic, int transparent, hmi_color_t *transparent_color);繪制出圖片。pic為hmi_gui_loadpic返回的那個數(shù)據(jù)結(jié)構(gòu),transparent表示圖片是否采用透 明方式,transparent_color為透明顏色。返回值1表示成功,0表示失敗

37、。int hmi_gui_set_line_style(yoid *gui, int Hne_width, hmi_color_t *color, int restore);設(shè)置直線的格式,包括line_width (線寬)、color(線的顏色)、restore是保留的。int hmi_gui_moveto(void *gui, int x, int y);int hmi_gui_lineto(void *gui, int x, int y);這兩個是用于繪制直線的函數(shù)。hmi_gui_moveto用于將鼠標(biāo)移動到入?yún),y指定的位置, hmi_gui_lineto用于從鼠標(biāo)當(dāng)前位置到入?yún),y指定的位置繪制一條直線。返回值1表示成 功,0表示失敗。例如繪制趨勢時,一般是先用hmi_gui_movet。將鼠標(biāo)移動到一個畫線的 初始位置,然后連續(xù)使用hmi_gui_linet

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論