QT中使用.so有两种方式,一种是普通的.so,包含了一些函数,这种暂且不讨论
另外一种是QT中所谓的Plugin,每一个.so都包含了一个类的实现,这个类可以是一个QObject的派生类,所以,插件可以按照类的形式把某些操作封装。接下来讨论这种用法。
插件工程的建立:
第一步,通常在建立Plugin之前,需要首先有一个抽象类,用来描述Plugin的功能。
通常,抽象类写在一个.h文件中,并且,通常都会包含<QtGUI>,如果不包含,需要使用QObject派生类时会有问题。
如:
#include <QtGui>
#include <QWidget>
class TestInterface
{
public:
virtual ~TestInterface() {}
public:
virtual QString Name() = 0;
virtual bool doSomeThing() = 0;
};
Q_DECLARE_INTERFACE(TestInterface, "com.trolltech.Plugin.TestInterface/1.0") //这个宏用声明接口
最后的Q_DECLARE_INTERFACE不能少,否则编译出来的动态链接库不能被QT识别!
有了抽象类之后,接下来进入第二步,创建动态链接库工程:

新建工程时选择C++ Library Project,然后进入下一步后,Type选择“Shared library”,表示创建动态库:

取好名字后,在下一步中选择需要的组件,通常都会把QtGui选中:

后面的步骤根据需要进行设置即可。
第三步,在生成的工程的头文件中,包含之前编写的抽象类头文件,并将向导自动创建的类修改为抽象类的派生类:
#ifndef PODTEST_H
#define PODTEST_H
#include "pod_global.h"
#include "testInterface.h"
class PODSHARED_EXPORT PodTest : public TestInterface {
Q_INTERFACES(TestInterface)
public:
PodTest();
};
#endif // PODTEST_H
其中,Q_INTERFACES(TestInterface)是表示该类使用TestInterface接口。
在派生类的声明中,可以添加需要的虚函数的实现。
第四步,在.c文件中添加成员函数的实现。另外,在文件的最后,添加一行:
Q_EXPORT_PLUGIN2(pod, PodTest);
表示此动态库需要将PodTest类导出。
其中,pod是工程名,PodTest是需要导出的类名。
至此,动态库工程创建完毕。
动态库的使用:
QPluginLoader可以调用某个.so的插件。
QPluginLoader loader("libtest.so");
PodTest *plugin = qobject_cast<TestInterface*>(loader.instance()); // 获取so中的类的对象