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插件的更多相关文章

  1. Qt入门学习——Qt 5 帮助文档的使用

    Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...

  2. Qt入门——使用QT+VS2008开发windows应用程序

    1.文件->新建->项目 Qt4 Projects 右边已安装模板当中选择At Application. 确定 2.选择需要使用的QT库 下一步 3. “class name”:指定类的名 ...

  3. Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10

    本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...

  4. Qt中如何 编写插件 加载插件 卸载插件

    Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoade ...

  5. QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)

    QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...

  6. Qt入门之基础篇(1):Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  7. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  8. Qt入门之基础篇(三):掌握Qt4的静态编译基本方法

    转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...

  9. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  10. 在Qt中如何编写插件,加载插件和卸载插件(转)

    Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...

随机推荐

  1. C#压缩文件为zip格式

    Vercher   C#压缩文件为zip格式 需要ICSharpCode.SharpZipLib.dll,网上下载的到. 代码是从网上找来的: 1 public class ZipClass 2 { ...

  2. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

  3. css布局小技巧 2016.03.06

    偶遇一个可爱的css布局学习网站,立刻学起来哟- max-width: 当页面左右宽度缩小时,为了避免出现左右滚动条的糟糕体验,就可以用到max-width啦!页面比宽度小时,会自动缩小哦- max- ...

  4. SGU 193.Chinese Girls' Amusement

    /* 实际上就是求一个k,满足k<=n/2,且gcd(n,k)=1 如果n为奇数,k为[n/2] 如果n为偶数,k=n/2-1-(n/2)%2 */ #include <iostream& ...

  5. Python下调用json.dumps中文显示问题解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...

  6. seaJs初体验

    目录结构 模块定义define define(function(require,exports,module){ //exports可以把方法或属性暴露给外部 exports.name = 'hell ...

  7. sql查询一个班级中总共有多少人以及男女分别多少人

    --创建视图 create view StuClassView as SELECT s.ID ,s.StuName ,s.StuAge ,s.StuAddress ,s.StuTel ,s.Class ...

  8. Python Tutorial 学习(六)--Modules

    6. Modules 当你退出Python的shell模式然后又重新进入的时候,之前定义的变量,函数等都会没有了. 因此, 推荐的做法是将这些东西写入文件,并在适当的时候调用获取他们. 这就是为人所知 ...

  9. SVN 使用的简单整理

    1. 在SVN服务器上创建存储Dir,并和个人主机建立联系.      现在SVN服务器上创建一个存储文件夹svn_storeDir.然后在个人电脑上建立一个本地文件夹local_Dir.    进入 ...

  10. bzoj1563: [NOI2009]诗人小G

    Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...