警告: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,把插件放置到该目录下。