




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、控件繪制的大致思路:在一個(gè)控件工程里,首先是有個(gè)pro文件,pro文件里配置了將控件工程生成的dll文件是復(fù) 制到re lease還是debug里的modules文件夾里。組態(tài)軟件一運(yùn)行就依次掃描modules文件里 的文件,將這些文件注冊(cè)到組態(tài)環(huán)境,這樣控件裝載到組態(tài)環(huán)境中pro文件里也列出了所 有的頭文件和源文件,源文件一般有至少一個(gè)c文件和兩個(gè)cpp文件??丶氖褂糜袃煞N情 況,一:用于組態(tài)工程離線模擬;二:用于組態(tài)環(huán)境的裝載。這兩種情況是共用一段繪制代 碼,這段繪制代碼我們放在c文件,由于QT自帶的繪制函數(shù)不能適用于離線模擬,所以繪 制代碼里用到的繪制函數(shù)都是自己編寫提供的,同時(shí)在c文
2、件里也需要調(diào)用module_init和 module_exit來實(shí)現(xiàn)離線模擬時(shí)的控件注冊(cè),而兩個(gè)cpp文件是用于組態(tài)環(huán)境的控件裝載。 頭文件主要就是用于函數(shù)和類結(jié)構(gòu)的聲明。控件在離線模擬情況下的實(shí)現(xiàn)主要是通過module_init和module_exit這兩個(gè)函數(shù)。_declspec(dllexport) int module_init(char *params)line_init();return 1;模塊初始化函數(shù)并導(dǎo)出模塊,運(yùn)行程序一運(yùn)行,程序就開始搜索這些模塊,而這個(gè)函數(shù)的實(shí) 現(xiàn)是一個(gè)初始化函數(shù),而line_init ()這個(gè)函數(shù)是將這個(gè)控件(直線)注冊(cè)到這個(gè)運(yùn)行程序 中。_decls
3、pec(dllexport) void module_exit()模塊退出函數(shù),運(yùn)行系統(tǒng)退出時(shí)將自動(dòng)調(diào)用該函數(shù)。以直線控件為例,控件在組態(tài)環(huán)境的中的實(shí)現(xiàn)實(shí)際上是通過 Q_EXPORT_PLUGIN2(customwidgetplugin, LinePlugin)這個(gè)函數(shù),將控件注冊(cè)到組態(tài)環(huán)境中, 這里的 LinePlugin 就是一個(gè)插件類,其中 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();這個(gè)類里的成員函數(shù)都是純虛函數(shù),而這些純虛函數(shù)的實(shí)現(xiàn)留給該類的派生類去做,方便使用了多態(tài)特性。LinePlugin就是一個(gè)一個(gè)的實(shí)現(xiàn)上面的函數(shù)。n
6、ame():表示控件的名字;group():表示這個(gè)控件屬于控件箱哪個(gè)組,例如直線就屬于基本控件,xy曲線屬于趨勢(shì)曲線。toolTip():表示這個(gè)控件的工具提示;whatThis():表示這個(gè)控件的信息;displayName():表示這個(gè)控件在控件箱里的顯示名字;icon():表示這個(gè)控件在控件箱里的顯示圖片;isContainer():表示這個(gè)控件是否是容器類的;creatWidget(QWidget *parent):創(chuàng)建一個(gè)窗口,即調(diào)用了一個(gè)類,這個(gè)類包含了控件的屬性、 畫法。isInitialized():是否初始化;initialize(QDesignerFormEditorIn
7、terface *core):控件被初始化;domXml():指出了這個(gè)控件信息保存為xml格式的寫法;四.上面提到的creatWidget(QWidget *parent)的實(shí)現(xiàn)是調(diào)用了一個(gè)類,這個(gè)類(以直線控件 為例,這個(gè)類是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是指這個(gè)屬性放到屬性列表里哪個(gè)屬性組里;saveType是指這 個(gè)屬性的數(shù)據(jù)類型,例如字符串型、無符號(hào)長(zhǎng)整型等,也是用于保存到xml文件中的;value 是屬性值,可以是具體的數(shù)值,也可以是Qcolor; isDynamicProp是指這個(gè)屬性是否支持動(dòng) 態(tài)屬性。void addProperty(QString name, QString caption, QString group, QString saveType, QStringList keys ,int baseIndex
9、 =0, int defaultIndex = 0,bool isDynamicProp=true);給控件添加一個(gè)多屬性值的屬性,其中name,caption,group,saveType,isDynamicProp的含義 跟函數(shù)1是一樣的,keys是所有屬性值的列表,baseIndex表示這個(gè)屬性值列表的索引的起 始值,defaultIndex表示這個(gè)屬性值表的默認(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);這個(gè)Direction的屬性,初始顯示為L(zhǎng)eftTop 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);給控件添加一個(gè)多屬性值的屬性。virtual bool save
11、Property(QXmlStreamWriter &writer, QString propertyName);將控件的當(dāng)前的屬性值和其他屬性信息保存到xml文件中,write是一個(gè)xml文件的指針, propertyName是屬性名,我們一般的寫法為:bool line:saveProperty(QXmlStreamWriter &writer, QStringpropertyName)return false;但是有一些情況,例如軟鍵盤里有一個(gè)font (字體大小)的屬性是個(gè)多屬性值的,用戶想要 保存的是當(dāng)前的具體的字體大小值,而不是屬性值的當(dāng)前索引。我們就要把這個(gè)函數(shù)的實(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ù)類型,長(zhǎng)度,屬性值裝載到屬性列表中。一般的寫 法為:bool line:loadProperty(const QString &propertyName,const QString &type,const QString &length,const QString &value)return false;但對(duì)于像軟鍵盤的那種字體大小的屬性裝載,函數(shù)的實(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í)”和“釋放時(shí)”事件, 需要將這個(gè)函數(shù)進(jìn)行重載。void addEvent(QString name, QString caption, QString code);如果控件的事件不是默認(rèn)的“按下時(shí)”和“釋放時(shí)”事件,就需要在控件里添加事件,重新 實(shí)現(xiàn)Init(),在這個(gè)函數(shù)內(nèi)添加事件。例如定時(shí)器里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是指這個(gè)屬性放到屬性列表里哪個(gè)屬性組里;value是所 關(guān)聯(lián)的實(shí)施數(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);添加顯示欄屬性,這個(gè)主要用于標(biāo)題欄的文本顯示,例如報(bào)警窗口和歷史數(shù)據(jù)列表的標(biāo)題欄 的文本顯示。name,caption,group,isDynamicProp的含義跟函數(shù)1 一樣;kind是用來標(biāo)識(shí)這個(gè) 標(biāo)題欄是屬于報(bào)警窗口的還是屬于歷史列表窗口的,0表示是報(bào)警
20、窗口,1表示是歷史列表 窗口; allfieled表示所有的標(biāo)題欄文本;selectedField表示被選擇的標(biāo)題欄文本。unsigned int getFontSize(QString propertyName);這個(gè)函數(shù)用于得到字體大小。propertyName是屬性名,返回值就是字體的大小。int getFontIndex(QString propertyName, const QString &value);這個(gè)函數(shù)通過屬性名propertyName和xml文件中保存的value值得到這個(gè)value的當(dāng)前索引 值。void saveFontSizeProperty(QXmlStream
21、Writer &writer, QStringpropertyName); void loadFontSizeProperty(QString propertyName, const QString &value);這兩個(gè)函數(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)的方法保存下來,就可以使用這個(gè)函數(shù)將屬性保存到xml文件 中,propertyName屬性名;type屬性值的數(shù)據(jù)類型;value屬性值;length屬性值的長(zhǎng)度。例如bemtext里保存字體寬度時(shí),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這個(gè)類的具體實(shí)現(xiàn),在實(shí)例函數(shù)中添加控件的屬性;實(shí)現(xiàn)saveProperty和loadProperty 函數(shù);根據(jù)控件屬性將控件繪制出來,調(diào)用的void paintEvent(QPaintEvent * /* event */)這個(gè) 函數(shù)。五.控件的繪制沒有直接調(diào)用Qt里自帶的函數(shù),而是自己編寫的函數(shù),下面是控件繪制里用到的函數(shù)和一些類。對(duì)于比較復(fù)雜的控件,我們可以把控件的所有屬性作為一個(gè)結(jié)構(gòu)體的成員來處理。在函 數(shù)中用到的屬性,我們直接定義它的一個(gè)結(jié)構(gòu)體就行了。繪制控件的一些結(jié)構(gòu)體函數(shù):2.1typedef struct _
24、hmi_rec_tshort left;short top;short right;short bottom;hmi_rect_t;這個(gè)結(jié)構(gòu)體是指我們?cè)诋嬅嫔戏胖每丶r(shí)所拉出的那個(gè)矩形。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)的點(diǎn)。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);繪制一個(gè)像素點(diǎn),通過x,y確定點(diǎn)的位置,color為這個(gè)點(diǎn)的顏色,返回值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表示實(shí)線#define LINE_STYLE_DOT2表示點(diǎn)線#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為文本長(zhǎng)度, 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表示失敗。也可以把這個(gè)函數(shù)完成的功能分成下面的三個(gè)函數(shù)共同完成。void *hmi_gui_loadpic(char filename);加載圖片名為filename的圖片文件,這個(gè)函數(shù)返回一個(gè)void*的指針,指針指向了一個(gè)內(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返回的那個(gè)數(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);這兩個(gè)是用于繪制直線的函數(shù)。hmi_gui_moveto用于將鼠標(biāo)移動(dòng)到入?yún),y指定的位置, hmi_gui_lineto用于從鼠標(biāo)當(dāng)前位置到入?yún),y指定的位置繪制一條直線。返回值1表示成 功,0表示失敗。例如繪制趨勢(shì)時(shí),一般是先用hmi_gui_movet。將鼠標(biāo)移動(dòng)到一個(gè)畫線的 初始位置,然后連續(xù)使用hmi_gui_linet
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)書正文格式
- 課題申報(bào)書整體框架
- 英語評(píng)價(jià)課題申報(bào)書
- 歷史學(xué)課題申報(bào)書
- 公司與茶農(nóng)合作合同范本
- 省課題申報(bào)立項(xiàng)書
- 大數(shù)據(jù) 課題申報(bào)書
- Dj學(xué)員培訓(xùn)合同范本
- 合同范本主要表現(xiàn)形式為
- 勞務(wù)中包合同范本
- 硬化性肺泡細(xì)胞瘤-課件
- 裕興新概念英語第二冊(cè)筆記第42課
- 簡(jiǎn)明新疆地方史趙陽
- 狹窄性腱鞘炎中醫(yī)臨床路徑及表單
- Q∕SY 19001-2017 風(fēng)險(xiǎn)分類分級(jí)規(guī)范
- 智慧消防綜合解決方案
- 市場(chǎng)營銷組合策略及營銷戰(zhàn)略課件
- 信息技術(shù)基礎(chǔ)ppt課件(完整版)
- DGJ 08-70-2021 建筑物、構(gòu)筑物拆除技術(shù)標(biāo)準(zhǔn)
- 2022年義務(wù)教育語文課程標(biāo)準(zhǔn)(2022版)解讀【新課標(biāo)背景下的初中名著閱讀教學(xué)質(zhì)量提升思考】
- 屋面網(wǎng)架結(jié)構(gòu)液壓提升施工方案(50頁)
評(píng)論
0/150
提交評(píng)論