Qt入门(11)——Qt插件
Qt提供了一个简单地插件接口,可以轻松地生成作为独立组件的定制数据库驱动、图象格式、文本编解码器(text codec)、风格(style)和部件。
警告:Qt 3.0.5对插件的一些方面做了改变,具体涉及到装载、路径操作和库版本。这些变化的结果是,Qt 3.0.4及以前版本编译的插件都不能用于Qt 3.0.5及以后版本。
写一个插件通过以下方式完成:写适当的插件基类的子类,实现几个函数,再添加一个宏。
一共有五个插件基类。派生的插件缺省保存于标准插件目录。
基类 缺省路径
QImageFormatPlugin $QTDIR/plugins/imageformats
QSqlDriverPlugin $QTDIR/plugins/sqldrivers
QStylePlugin $QTDIR/plugins/styles
QTextCodecPlugin $QTDIR/plugins/codecs
QWidgetPlugin $QTDIR/plugins/designer
假设你有一个新的风格类,叫做'MyStyle',你要把它做成插件的形式。需要的代码直截了当:
class MyStylePlugin : public QStylePlugin
{
public:
MyStylePlugin() {}
~MyStylePlugin() {} QStringList keys() const {
return QStringList() << "MyStyle";
} QStyle* create( const QString& key ) {
if ( key == "MyStyle" )
return new MyStyle;
return 0;
}
};
Q_EXPORT_PLUGIN( MyStylePlugin )
构造器和解构器不需要做什么,空的就可以。有两个虚函数一定要实现。第一个是keys(),它返回在插件中实现的类的一个字符串列表。(我们在上面的例子中刚刚实现了一个类。)第二个是一个函数,它返回所要的类的一个对象(或者0,如果插件被要求生成一个不存在的类的对象)。对于QStylePlugin来说,这第二个函数叫做create()。
可以在一个插件里实现任意数目的插件子类,只要他们都是由同一个基类,比如说,QStylePlugin,派生出来的。
对于数据库驱动、图象格式、定制部件和文本编解码器,不需要显式的对象生成过程。Qt会按需求查找并生成他们。风格则是例外,因为你可能想以代码显式地设置一个风格。应用一个风格,可以使用类似代码:
QApplication::setStyle( QStyleFactory::create( "MyStyle" ) );
有的插件类还需要实现其他函数。关于一个QWidgetPlugin的完全例子,可参见Qt设计器手册中'生成定制部件'一章的'生成定制部件'节。这个例子实现了额外的函数,以把该插件集成到Qt设计器中去。QWidgetFactory类提供了关于QWidgetPlugin的附加信息。
关于每种类型的插件必须要实现哪些虚拟函数,详见该类的文档。
Qt的应用自动辨识哪些插件可用,因为插件都是保存在标准插件子目录下的。为此,应用不需要任何查找和装载插件的代码,既然Qt已自动处理了。
插件的缺省目录是$QTDIR/plugins,每种类型的插件在那种类型的子目录下,比如说,风格(styles)。如果你想要你的应用使用插件但不要标准插件路径,可以让你的安装程序决定你要为插件使用的路径,然后保存该路径,比如说使用QSettings,以使应用在运行时可以读取。之后应用可以用该路径调用QApplication::addLibraryPath(),就可以使用你的插件了。注意,路径的最后部分,也就是说,styles、widgets等等,不能改变。
应用包括一个插件的正规方法是,要么把插件与应用一起编译,要么把插件编译为DLL(或者so或者其他平台指定的库类型),像其他库那样使用。如果要让插件可装载,一个方法是,生成一个应用下的子目录,例如,appdir/plugins/designer,把插件放置到该目录下。
Qt入门(11)——Qt插件的更多相关文章
- Qt入门学习——Qt 5 帮助文档的使用
Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...
- Qt入门——使用QT+VS2008开发windows应用程序
1.文件->新建->项目 Qt4 Projects 右边已安装模板当中选择At Application. 确定 2.选择需要使用的QT库 下一步 3. “class name”:指定类的名 ...
- Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10
本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...
- Qt中如何 编写插件 加载插件 卸载插件
Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoade ...
- QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)
QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...
- Qt入门之基础篇(1):Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- Qt入门之基础篇(三):掌握Qt4的静态编译基本方法
转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...
- Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- 在Qt中如何编写插件,加载插件和卸载插件(转)
Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...
随机推荐
- php 编译安装的一个 configure 配置
yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel f ...
- junit 测试注解
* @Test: 将一个 普通的方法修饰成为一个测试方法* @BeforeClass: 他会在所有的方法运行前被执行,static修饰* @AfterClass 他会在所有方法运行结束后被执行,sta ...
- Python之路【第十二篇】:JavaScrpt -暂无内容-待更新
Python之路[第十二篇]:JavaScrpt -暂无内容-待更新
- 微软企业库Microsoft Enterprise Library的相关文章链接
微软企业库4.1学习笔记 http://blog.csdn.net/anyqu/article/category/1228691/3 黄聪:Enterprise Library 5.0 系列教程 ww ...
- for循环,如何结束多层for循环
采用标签方式跳出,指定跳出位置, a:for(int i=0;i<n;i++) { b:for(int j=0;j<n;j++) { if(n=0) { break a; } } }
- linux下启动oracle服务命令
以redflag(redhat /centos)linux下的 oracle 10g 为例: 如果oracle安装和配置都没有问题的话: 依次执行以下代码即可启动oracle服务. #su - ora ...
- C#读取Visual FoxPro(*.dbf)数据并使用SqlBulkCopy插入到SqlServer 2008 R2数据表中
公司数据库从32位的SqlServer 2005升级到64位的SqlServer 2008 R2后,无法再像原来通过Link Server连接VFP同步数据,因此考虑用代码程序从VFP数据库中读取所需 ...
- CSS居中的方法总结
[水平居中] 行内:text-align:center; 定宽块状:1.left:0 right:0然后用margin: auto外边距填充,水平方向不会发生外边距叠加; 2.绝对定位(父元素定位不 ...
- java基础之反射机制
一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- Thinkphp 事物问题
$m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result= ...