• 10837阅读
  • 11回复

QT开发插件问题! [复制链接]

上一主题 下一主题
离线twb123
 
只看楼主 倒序阅读 楼主  发表于: 2008-08-22
— 本帖被 XChinux 执行加亮操作(2008-08-25) —
请问有谁用QT开发过插件,能传授点经验吗?谢谢!
离线nmiirq

只看该作者 1楼 发表于: 2008-08-22
assistant 里面不是有一个时钟插件的例子吗?可以参考一下下~
离线icevi

只看该作者 2楼 发表于: 2008-08-22
插件需要注意接口,一时也说不清楚,反正要注意各类接口的设定。看例子比较好。
插件发布时一定要注意插件编译所使用的QT版本和同时发布的QT的DLL的版本一定要匹配,否则插件不能加载。
插件若引用了其它DLL,这些文件也不能少。
====================
www.bilive.com
BiForm BiReader BiChat
最爱QT和PYTHON
====================
离线twb123
只看该作者 3楼 发表于: 2008-08-22
谢谢!我想做的是QT应用程序插件.可是插件好像没有main.cpp文件吧?单独编写的插件如何调试呢?
难道每次都要和应用程序一起编写吗?望各位多指教!
离线icevi

只看该作者 4楼 发表于: 2008-08-22
不用和应用程序一起编写,但两者编译时使用的QT版本和一些环境设置最好一样,否则可能发布后加载不了。
QT里有帮助说明,以及示例。
QT源代码中有一些也是插件,你可以找个简单的看一下结构。这样可能比较容易了解。
插件不需要main.cpp,需要在PRO里设定
TEMPLATE = lib
CONFIG += plugin
在程序中定义CLASS时需要定义一些宏,比如下面
class opensslPlugin : public QObject, public QCAPlugin
{
    Q_OBJECT
    Q_INTERFACES(QCAPlugin)
在插件CPP程序最后一行要加上
Q_EXPORT_PLUGIN2(插件DLL文件名,插件源程序中继随插件类型的类名)
否则插件用不了。
====================
www.bilive.com
BiForm BiReader BiChat
最爱QT和PYTHON
====================
离线xjcook

只看该作者 5楼 发表于: 2008-08-25
转帖,整理

让基于QT的应用程序支持插件扩展的步骤:

1.    定义一个接口集(只有纯虚函数的类),用来与插件交流。如:
class DbmInterface
{
public:
    virtual ~DbmInterface() {}

    virtual testpro* create(QString &clname) = 0;
};
2. 用宏Q_DECLARE_INTERFACE()将该接口告诉Qt元对象系统
Q_DECLARE_INTERFACE(DbmInterface, "com.trolltech.dbm.DbmInterface/1.0")

3. 应用程序中用QPluginLoader来装载插件。
QPluginLoader loader(".\\testplug.dll");

4. 用宏qobject_cast()来确定一个插件是否实现了接口。如果成功则可以直接调用插件接口函数。
QObject *plugin = loader.instance();
if (plugin)
    {
        DbmInterface* dbm = qobject_cast<DbmInterface*>(plugin);
        if (dbm)
            proa = dbm->create(QString(""));
    }



▲写一个插件的步骤:
1.    声明插件类,该类从QObject和该插件希望实现的接口继承而来。
2. 用宏Q_INTERFACES()将该接口告诉Qt元对象系统。
class DbmInterfacePlugin : public QObject, public DbmInterface
{
    Q_OBJECT
        Q_INTERFACES(DbmInterface)

public:
    ~DbmInterfacePlugin(){};

    testpro* create(QString &clname){return new ipro;};
};
3. 用宏Q_EXPORT_PLUGIN2()导出插件(在CPP文件中)。
Q_EXPORT_PLUGIN2(testplug, DbmInterfacePlugin);

▲编译插件来扩展应用程序时,确保插件和应用程序用同样的配置这一点很重要。这意味着如果应用程序是release模式编译的,那么插件也要是release模式。

▲装载插件时,Qt核对每一个插件的联编关键字要和自己的匹配,以保证所装载的是兼容的插件;任何不匹配的插件不会被装载。

▲为了调试可能需要关闭联编关键字校验功能,这可以通过将你运行应用程序的环境的环境变量QT_NO_PLUGIN_CHECK设置为非零来实现。
离线twb123
只看该作者 6楼 发表于: 2008-08-25
谢谢侠客!QT的例子我看了,由于我是新手,对有的地方理解还不到位.
还有一点疑惑:不用main.cpp文件,怎么做到呢?谢谢!
离线twb123
只看该作者 7楼 发表于: 2008-08-25
谢谢 icevi , xjcook!QT的例子我看了,由于我是新手,对有的地方理解还不到位.
还有一点疑惑:不用main.cpp文件,怎么做到呢?谢谢!
离线xjcook

只看该作者 8楼 发表于: 2008-08-25
不用vmain.cpp,没啥怎么做到的,你只需要把你需要实现的虚接口实现了就可以了,
其他的那个宏帮你做了,他会实现一些特定的接口,使其可以被访问。
离线twb123
只看该作者 9楼 发表于: 2008-08-25
恩!感谢帮助!
我再试试吧>
离线wbyqy

只看该作者 10楼 发表于: 2009-08-29
mark
离线jotiny

只看该作者 11楼 发表于: 2009-12-15
标记一下,应该用得着
快速回复
限100 字节
 
上一个 下一个