- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
新软件控件的写法
一.控件绘制的大致思路:
在一个控件工程里,首先是有个pro文件,pro文件里配置了将控件工程生成的dll文件是复制到release还是debug里的modules文件夹里。组态软件一运行就依次扫描modules文件里的文件,将这些文件注册到组态环境,这样控件装载到组态环境中。pro文件里也列出了所有的头文件和源文件,源文件一般有至少一个c文件和两个cpp文件。控件的使用有两种情况,一:用于组态工程离线模拟;二:用于组态环境的装载。这两种情况是共用一段绘制代码,这段绘制代码我们放在c文件,由于QT自带的绘制函数不能适用于离线模拟,所以绘制代码里用到的绘制函数都是自己编写提供的,同时在c文件里也需要调用module_init和module_exit来实现离线模拟时的控件注册,而两个cpp文件是用于组态环境的控件装载。头文件主要就是用于函数和类结构的声明。
二.控件在离线模拟情况下的实现主要是通过module_init和module_exit这两个函数。
__declspec(dllexport) int module_init(char *params)
{
line_init();
return 1;
}
模块初始化函数并导出模块,运行程序一运行,程序就开始搜索这些模块,而这个函数的实现是一个初始化函数,而line_init()这个函数是将这个控件(直线)注册到这个运行程序中。
__declspec(dllexport) void module_exit()
{
}
模块退出函数,运行系统退出时将自动调用该函数。
三.以直线控件为例,控件在组态环境的中的实现实际上是通过Q_EXPORT_PLUGIN2(customwidgetplugin, LinePlugin)这个函数,将控件注册到组态环境中,这里的LinePlugin就是一个插件类,其中LinePlugin继承于QDesignerCustomWidgetInterface(Qt内部的类)。
class QDesignerCustomWidgetInterface
{
public:
virtual ~QDesignerCustomWidgetInterface() {}
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 *parent) = 0;
virtual bool isInitialized() const { return false; }
virtual void initialize(QDesignerFormEditorInterface *core) { Q_UNUSED(core); }
virtual QString domXml() const
{
return QString::fromUtf8(widget class=\%1\ name=\%2\/)
.arg(name()).arg(name().toLower());
}
};
这个类里的成员函数都是纯虚函数,而这些纯虚函数的实现留给该类的派生类去做isContainer(): 表示这个控件是否是容器类的;
creatWidget(QWidget *parent): 创建一个窗口,即调用了一个类,这个类包含了控件的属性、画法。
isInitialized(): 是否初始化;
initialize(QDesignerFormEditorInterface *core): 控件被初始化;
domXml():指出了这个控件信息保存为xml格式的写法;
上面提到的creatWidget(QWidget *parent)的实现是调用了一个类,这个类(以直线控件为例,这个类是line)继承于QhmiWidget。QhmiWidget类提供了关于控件属性相关的一些函数,这些函数如下所示:
void addProperty(QString name, QString caption, QString group, Q
文档评论(0)