C0EEBDA1

在梦中,我是有超能力的。。。

« 嵌入式Linux下支持dhcp客户端在arm-linux-gcc 3.4.1下编译 qt-embedded-4.6.2 »

QT中使用动态链接库

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识别!

有了抽象类之后,接下来进入第二步,创建动态链接库工程:

clip_image002

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

clip_image004

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

clip_image006

后面的步骤根据需要进行设置即可。

第三步,在生成的工程的头文件中,包含之前编写的抽象类头文件,并将向导自动创建的类修改为抽象类的派生类:

#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中的类的对象

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80722 Code detection by Codefense  theme by BokeZhuti

Copyright 2008-2009 C0EEBDA1. Some Rights Reserved. 备案号:京ICP备09020681号