分享

创建和使用Qt插件的简单例子

 guitarhua 2012-12-01
英文原文参见我的博客:http:///2011/10/a-sample-on-creating-using-lower-level-qt-plugins/
更多关于Qt的文章请访问我的博客:http:///


在Qt中,lower-level的插件可被用来扩展程序的功能。从这个角度来讲,其和动态链接库有很大相似指出,但提供了更多的灵活性:程序在编译的时候不用与插件链接,而可在运行时动态加载和使用。

在创建插件以前,我们需要首先定义一个接口,用于程序和插件之间的交互:
C/C++ code??
1
2
3
4
5
6
7
8
9
10
11
class MyInterface
{
public:
    virtual ~MyInterface() {}
  
    virtual QString getString() = 0;
};
 
// 将MyInterface和"me.xzis.MyInterface/1.0"这一唯一标识符绑定
// 注意该操作不能在任何namespace内完成
Q_DECLARE_INTERFACE(MyInterface, "me.xzis.MyInterface/1.0")


然后我们实现一个简单的插件:
C/C++ code??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// myplugin.h
class MyPlugin : public QObject, public MyInterface
{
    Q_OBJECT
  
    // 将该接口注册到Qt的meta-object system
    Q_INTERFACES(MyInterface)
  
public:
    virtual QString getString();
};
  
// myplugin.cpp
QString MyPlugin::getString()
{
    return "Qt Plugins";
}
  
// 导出该插件
// 注意.pro中的TARGET必须是"myPlugin"
Q_EXPORT_PLUGIN2(myPlugin, MyPlugin)


在插件的.pro中:
JavaScript code??
1
2
3
TEMPLATE = lib
CONFIG += plugin
TARGET = myPlugin


最后在程序中,我们可以用以下代码来使用插件:
C/C++ code??
1
2
3
4
5
6
7
8
9
QPluginLoader loader("/path/to/myPlugin");
// 该函数会自动加载插件
// 注意加载插件的耗时较长
QObject *instance = loader.instance();
if (instance) {
    // 必须使用qobject_cast做类型转换
    MyInterface *interface = qobject_cast<MyInterface *>(instance);
    qDebug() << interface->getString();
}


Happy hacking!

QObject派生类作为Qt 插件的Interface


Qt 之 qobject_cast 分析及QTBUG 20616
(与插件有关的问题一则)

Qt插件的析构函数不被调用(QTBUG17458)

Qt 插件学习(一)

Qt 插件路径(笔记)

Qt Lighthouse学习(三)(关于Qt5 的lighthouse插件)

QtInternal 之 Plugin

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多