详解如何建立Qt插件学习教程

移动开发
如何建立Qt插件学习教程是本文要介绍的内容,主要是来了解QT中插件的应用,如何来建立,文中有详解,具体内容的实现来看详解。

如何建立Qt插件学习教程是本文要介绍的内容,主要是来了解QT插件的应用,如何来建立,文中有详解,具体内容的实现来看详解。

QT提供2个API来建立插件

1、高层API扩展QT库。例如定制的数据库驱动,图像格式,字符编码,custom styles

2、底层API扩展QT应用程序

例如,如果想写自定义QStyle的子类,并让应用程序动态加载,需要使用高层API函数

因为高层API在底层API基础上构造,两者需要注意一些问题。

如果需要提供给QT Designeder插件,请参考QtDesigner模型文档

高层API

利用继承特定的基类来实现插件,需要实现其中的一些函数,并增加一个宏

QT中有不少插件的基类可供使用,继承的插件默认保存在标准插件目录的子目录下,否则Qt会找不到。

设计一个style类名为MyStyle的插件

文件mystyleplugin.h:

  1. class MyStylePlugin : public QStylePlugin  
  2. {  
  3. public:  
  4. QStringList keys() const;    //返回此插件能够使用的style名称列表。  
  5. QStyle *create(const QString &key);//根据传入的style名称,返回style。  
  6. };  
  7.  
  8. mystyleplugin.cpp  
  9. #include "mystyleplugin.h"  
  10.  
  11. QStringList MyStylePlugin::keys() const  
  12. {  
  13. return QStringList() << "MyStyle";  
  14. }  
  15.  
  16. QStyle *MyStylePlugin::create(const QString &key)  
  17. {  
  18. if (key.toLower() == "mystyle")  
  19. return new MyStyle;  
  20. return 0;  
  21. }  
  22.  
  23. Q_EXPORT_PLUGIN2(pnp_mystyleplugin, MyStylePlugin) 

风格实现

文件mystyle.h:

  1. class MyStyle : public QWindowsStyle  
  2. {  
  3. Q_OBJECT  
  4.  
  5. public:  
  6. MyStyle() {};  
  7.  
  8. void polish(QPalette &palette);  
  9. }; 

继承自QWindowsStyle

风格实现

  1. void MyStyle::polish(QPalette &palette)  
  2. {  
  3. palette.setBrush(QPalette::Button, Qt::red);  

(注意其中实现的大小写方式)。

实现数据库驱动,图像格式、文本编码和大多数其他插件类型时,一般不需要建立对象,Qt会找到他们并建立他们的对象。Style是一个特例,因为程序中科能会这样调用:

  1. QApplication::setStyle(QStyleFactory::create("MyStyle")); 

main.c文件:

  1. int main(int argv, char *args[])  
  2. {  
  3. QApplication app(argv, args);//QT此时加载了插件  
  4. QApplication::setStyle(QStyleFactory::create("simplestyle"));  
  5.  
  6. StyleWindow window;  
  7. window.resize(200, 50);  
  8. window.show();  
  9.  
  10. return app.exec();  

工程文件:

  1. TEMPLATE    = lib 
  2. CONFIG     += plugin  
  3. HEADERS     = simplestyle.h \  
  4. simplestyleplugin.h  
  5. SOURCES     = simplestyle.cpp \  
  6. simplestyleplugin.cpp  
  7. TARGET      = simplestyleplugin 

注意,插件需要设置TEMPLATE,因为我们需要的是共享库而不是执行程序。同时必须设置CONFIG。需要将此插件保存到style文件夹(应用程序所在的文件夹)。这样应用程序就能够检测得到。

底层API:没有详细研究

不管是QT本身还是QT应用程序都可以通过插件扩展。这需要应用程序检测并通过QPluginLoader进行加载。因此,插件可以提供任意功能,而不仅限于上面说的插件。

插件扩展应用包括4个步骤

1、定义插件的接口集(实际上是只有虚函数的一个类)

2、Q_DECLARE_INTERFACE宏告诉meta-object系统此接口的存在。

3、利用QPluginLoader加载插件

4、使用qobject_cast()函数测试插件实现的借口

插件编码的4个步骤

1、继承QObject定义一个插件类,并定义插件需要的接口

2、使用Q_InterFaces()宏告诉meta-object系统接口的存在

3、使用Q_EXPORT_PLUGIN2()宏输出插件

4、编译工程

例如下面例子:

接口类:

  1. class FilterInterface    //只有虚函数的类  
  2. {  
  3. public:  
  4. virtual ~FilterInterface() {}  
  5.  
  6. virtual QStringList filters() const = 0;  
  7. virtual QImage filterImage(const QString &filter, const QImage &image,  
  8. QWidget *parent) = 0;  
  9. }; 

插件类,实现接口

  1. #include <QObject> 
  2. #include <QStringList> 
  3. #include <QImage> 
  4.  
  5. #include <plugandpaint/interfaces.h> 
  6.  
  7. class ExtraFiltersPlugin : public QObject, public FilterInterface  
  8. {  
  9. Q_OBJECT  
  10. Q_INTERFACES(FilterInterface)  
  11.  
  12. public:  
  13. QStringList filters() const;  
  14. QImage filterImage(const QString &filter, const QImage &image,  
  15. QWidget *parent);  
  16. }; 

定位插件

QT应用程序自动加载插件,因为插件存在标准插件的子目录中

开发过程中,插件的目录在QTDIR/plugins中(QDIR是QT安装的目录)。如果希望应用程序使用或不使用标准插件,安装会得到希望安装插件的路径,并保存路径(例如应用程序使用QSettings在启动时读取它)

应用程序可以通过QCoreApplication:addLibraryPath是插件对于应用程序可见,注意,最终的路径不能改变。

如果希望插件可被加载,一种方法是在应用程序的所在目录的子目录下保存此插件。如果想发布QT自带的任何插件,需要拷贝plugins的子目录到应用程序的根目录下。(而不是包含插件的目录)

静态插件

一般的方法是将插件做成动态库和应用程序一块发布。插件动态检测和加载。

应用程序可以静态链接。假如编译的是静态的QT库,那么静态插件就是唯一的选择了。使用静态插件可以降低错误概率。但是缺点是修改插件需要重新编译整个应用程序。

QT提供一些静态的插件:

为了静态链接插件,需要在程序中使用Q_IMPORT_PLUGIN宏,需要在编译时使用QTPLUGIN参数。例如,在main.cpp中

  1. #include <QApplication> 
  2. #include <QtPlugin> 
  3.  
  4. Q_IMPORT_PLUGIN(qjpeg)  
  5. Q_IMPORT_PLUGIN(qgif)  
  6. Q_IMPORT_PLUGIN(qkrcodecs)  
  7.  
  8. int main(int argc, char *argv[])  
  9. {  
  10. QApplication app(argc, argv);  
  11. ...  
  12. return app.exec();  

工程文件中

  1. QTPLUGIN     += qjpeg \  
  2. qgif \  
  3. qkrcodecs 

小结:详解如何建立Qt插件学习教程的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-09-07 16:28:46

QT WidgetQWidget

2011-09-01 15:51:53

Qt插件VS 2010

2011-08-30 16:02:10

MTK开发环境

2011-07-04 15:48:57

Qt 桌面

2011-06-27 16:59:19

Qt 动态 插件

2011-07-04 11:21:59

QT Designer

2011-06-24 10:54:34

Qt Mysql

2011-06-24 15:16:33

Qt 插件

2011-06-27 17:24:37

Qt 插件

2011-08-30 15:32:08

QtQuickQML

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-17 10:19:11

Qt QWidge QSetting

2011-06-24 09:13:30

QT SDL

2011-09-01 14:04:45

QT Webkit插件

2011-06-24 17:05:07

QT QT 4.7.3 windows

2011-06-24 09:39:05

2011-06-13 15:09:36

插件 Qt Designer

2010-05-18 13:53:34

Subversion插

2011-08-30 15:49:03

QtQuick

2011-07-04 17:26:00

Qt SQLite
点赞
收藏

51CTO技术栈公众号