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