版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、控件绘制的大致思路:在一个控件工程里,首先是有个pro文件,pro文件里配置了将控件工程生成的dll文件是复 制到re lease还是debug里的modules文件夹里。组态软件一运行就依次扫描modules文件里 的文件,将这些文件注册到组态环境,这样控件装载到组态环境中pro文件里也列出了所 有的头文件和源文件,源文件一般有至少一个c文件和两个cpp文件。控件的使用有两种情 况,一:用于组态工程离线模拟;二:用于组态环境的装载。这两种情况是共用一段绘制代 码,这段绘制代码我们放在c文件,由于QT自带的绘制函数不能适用于离线模拟,所以绘 制代码里用到的绘制函数都是自己编写提供的,同时在c文
2、件里也需要调用module_init和 module_exit来实现离线模拟时的控件注册,而两个cpp文件是用于组态环境的控件装载。 头文件主要就是用于函数和类结构的声明。控件在离线模拟情况下的实现主要是通过module_init和module_exit这两个函数。_declspec(dllexport) int module_init(char *params)line_init();return 1;模块初始化函数并导出模块,运行程序一运行,程序就开始搜索这些模块,而这个函数的实 现是一个初始化函数,而line_init ()这个函数是将这个控件(直线)注册到这个运行程序 中。_decls
3、pec(dllexport) void module_exit()模块退出函数,运行系统退出时将自动调用该函数。以直线控件为例,控件在组态环境的中的实现实际上是通过 Q_EXPORT_PLUGIN2(customwidgetplugin, LinePlugin)这个函数,将控件注册到组态环境中, 这里的 LinePlugin 就是一个插件类,其中 LinePlugin 继承于 QDesignerCustomWidgetInterface(Qt内部的类)。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();这个类里的成员函数都是纯虚函数,而这些纯虚函数的实现留给该类的派生类去做,方便使用了多态特性。LinePlugin就是一个一个的实现上面的函数。n
6、ame():表示控件的名字;group():表示这个控件属于控件箱哪个组,例如直线就属于基本控件,xy曲线属于趋势曲线。toolTip():表示这个控件的工具提示;whatThis():表示这个控件的信息;displayName():表示这个控件在控件箱里的显示名字;icon():表示这个控件在控件箱里的显示图片;isContainer():表示这个控件是否是容器类的;creatWidget(QWidget *parent):创建一个窗口,即调用了一个类,这个类包含了控件的属性、 画法。isInitialized():是否初始化;initialize(QDesignerFormEditorIn
7、terface *core):控件被初始化;domXml():指出了这个控件信息保存为xml格式的写法;四.上面提到的creatWidget(QWidget *parent)的实现是调用了一个类,这个类(以直线控件 为例,这个类是line)继承于QhmiWidgeto QhmiWidget类提供了关于控件属性相关的 一些函数,这些函数如下所示:void addProperty(QString name, QString caption, QString group, QString saveType, QVariant value,bool isDynamicProp=true);给控件添加单
8、一属性值的属性,其中name是用于保存到xml文件里;caption是用于在软件 中属性列表里显示的;group是指这个属性放到属性列表里哪个属性组里;saveType是指这 个属性的数据类型,例如字符串型、无符号长整型等,也是用于保存到xml文件中的;value 是属性值,可以是具体的数值,也可以是Qcolor; isDynamicProp是指这个属性是否支持动 态属性。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的含义 跟函数1是一样的,keys是所有属性值的列表,baseIndex表示这个属性值列表的索引的起 始值,defaultIndex表示这个属性值表的默认索引。例如: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,当选择为 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);将控件的当前的属性值和其他属性信息保存到xml文件中,write是一个xml文件的指针, propertyName是属性名,我们一般的写法为:bool line:saveProperty(QXmlStreamWriter &writer, QStringpropertyName)return false;但是有一些情况,例如软键盘里有一个font (字体大小)的属性是个多属性值的,用户想要 保存的是当前的具体的字体大小值,而不是属性值的当前索引。我们就要把这个函数的实现 进行修改:
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);装载控件的属性。将控件的属性名,数据类型,长度,属性值装载到属性列表中。一般的写 法为:bool line:loadProperty(const QString &propertyName,const QString &type,const QString &length,const QString &value)return false;但对于像软键盘的那种字体大小的属性装载,函数的实现如下: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);根据vlaue得到属性名name的属性值并设置。virtual void Init();控件初始化。给控件添加事件,如果控件的事件不是默认
17、的“按下时”和“释放时”事件, 需要将这个函数进行重载。void addEvent(QString name, QString caption, QString code);如果控件的事件不是默认的“按下时”和“释放时”事件,就需要在控件里添加事件,重新 实现Init(),在这个函数内添加事件。例如定时器里void timer:Init()addEvent(timer,tr(timer),);void addVarProperty(QString name, QString caption, QString group, QString value,bool isDynamicProp=tru
18、e);添加变量属性,可以关联数据库里的变量,name是用于保存到xml文件里;caption是用于 在软件中属性列表里显示的;group是指这个属性放到属性列表里哪个属性组里;value是所 关联的实施数据库里的数据名。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);添加显示栏属性,这个主要用于标题栏的文本显示,例如报警窗口和历史数据列表的标题栏 的文本显示。name,caption,group,isDynamicProp的含义跟函数1 一样;kind是用来标识这个 标题栏是属于报警窗口的还是属于历史列表窗口的,0表示是报警
20、窗口,1表示是历史列表 窗口; allfieled表示所有的标题栏文本;selectedField表示被选择的标题栏文本。unsigned int getFontSize(QString propertyName);这个函数用于得到字体大小。propertyName是属性名,返回值就是字体的大小。int getFontIndex(QString propertyName, const QString &value);这个函数通过属性名propertyName和xml文件中保存的value值得到这个value的当前索引 值。void saveFontSizeProperty(QXmlStream
21、Writer &writer, QStringpropertyName); void loadFontSizeProperty(QString propertyName, const QString &value);这两个函数在前面函数4和函数5里分别有使用过,saveFontSizeProperty是用于保存字 体大小的属性, loadFontSizeProperty 用于装载字体大小的属性。void writeDomProperty(QXmlStreamWriter &writer, QString propertyName, QString type, QString value, in
22、t length = 0);当控件的属性不能使用默认的方法保存下来,就可以使用这个函数将属性保存到xml文件 中,propertyName属性名;type属性值的数据类型;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这个类的具体实现,在实例函数中添加控件的属性;实现saveProperty和loadProperty 函数;根据控件属性将控件绘制出来,调用的void paintEvent(QPaintEvent * /* event */)这个 函数。五.控件的绘制没有直接调用Qt里自带的函数,而是自己编写的函数,下面是控件绘制里用到的函数和一些类。对于比较复杂的控件,我们可以把控件的所有属性作为一个结构体的成员来处理。在函 数中用到的属性,我们直接定义它的一个结构体就行了。绘制控件的一些结构体函数:2.1typedef struct _
24、hmi_rec_tshort left;short top;short right;short bottom;hmi_rect_t;这个结构体是指我们在画面上放置控件时所拉出的那个矩形。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为文本内容,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);绘制渐进三角形。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);绘制渐进矩形。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);绘制渐进椭圆形。left,top,right,bottom规定了所绘制渐进图形的范围,start_color为渐进起始颜色,end_color 为渐进结束颜色,direction为渐进图形的方向。返回值1表示成功,0表示失败。渐进三角形direction有以下几种情况:#define TRIANGLE_TOP_HORIZION#define TRIANGLE_BOTTOM_HORIZION#define TRIANGLE_RIGHT_VERTICAL#define TRIANGLE_LEFT_VERTICAL渐进三角形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表示渐进三角形朝上表示渐进三角形朝下表示渐进三角形朝右表示渐进三角形朝左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渐进椭圆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);设置颜色。将r,g,b值设置到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 设置为入参里的 left, top, right, bottom 的值。2.9关于图片的函数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表示失败。也可以把这个函数完成的功能分成下面的三个函数共同完成。void *hmi_gui_loadpic(char filename);加载图片名为filename的图片文件,这个函数返回一个void*的指针,指针指向了一个内部 用的数据结构,用于
36、保存加载的一些信息。void hmi_gui_unloadpic(void *pic);函数是用来释放由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返回的那个数据结构,transparent表示图片是否采用透 明方式,transparent_color为透明颜色。返回值1表示成功,0表示失败
37、。int hmi_gui_set_line_style(yoid *gui, int Hne_width, hmi_color_t *color, int restore);设置直线的格式,包括line_width (线宽)、color(线的颜色)、restore是保留的。int hmi_gui_moveto(void *gui, int x, int y);int hmi_gui_lineto(void *gui, int x, int y);这两个是用于绘制直线的函数。hmi_gui_moveto用于将鼠标移动到入参x,y指定的位置, hmi_gui_lineto用于从鼠标当前位置到入参x,y指定的位置绘制一条直线。返回值1表示成 功,0表示失败。例如绘制趋势时,一般是先用hmi_gui_movet。将鼠标移动到一个画线的 初始位置,然后连续使用hmi_gui_linet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年大型医院建设施工合同范本包工不包料
- 2024年度婚姻财产鉴定合同
- 2024工程项目借款合同
- 2024工地防水材料买卖合同书
- 2024年度基于BIM的建筑物流管理服务合同
- 合同履约的会计分录-记账实操
- 2024年商标许可使用权合同
- 全民节约用水倡议书范文(6篇)
- 2024年度建筑施工质量安全合同
- 2024年城市轨道建设特许经营协议
- 侵权告知函(盗用图片)
- 猪、牛、家禽屠宰冷链加工一体化项目可行性研究报告
- 诺贝尔生理学或医学奖史话 知到智慧树网课答案
- 太阳能光热转换和热储存技术
- AQ 2043-2012 石油行业安全生产标准化 陆上采气实施规范
- 天府国际生物城的规划方案
- MOOC 国际交流学术英文写作-湖南大学 中国大学慕课答案
- 健康科普宣传进社区活动方案
- 2024年(初级)游泳救生员理论考试题库(含A、B卷)
- 项目投资测算培训课件
- 法院拍卖成交确认书合集3篇
评论
0/150
提交评论