zoukankan      html  css  js  c++  java
  • Qt5该插件机制(7)--插件开发演示示例代码(Lower-level API)

    插件代码

    接口类的头文件 MyPluginInterface.h

    #ifndef INTERFACES_H
    #define INTERFACES_H
    
    #include <QtPlugin>
    
    #define QtPluginDemo_iid "org.qt-project.Qt.PluginDemo"
    
    class MyPluginInterface
    {
    public:
    	virtual int add(int,int) = 0 ;	// 正确写法
    	// virtual int add(int,int);	// 不太妥的写法(尽管这也是正确的虚函数声明语句)
    		// 注:接口类中的虚函数都应有实体,或设置为0(推荐)。这样
    		// C++的编译器才干为接口类生成虚函数表。

    否则,假设没有实现 // 接口类的虚函数也没有将其设为0,程序在在链接时可能会失败, // 或者链接成功但最后生成的库无法载入(库中有没有定义的符号) }; Q_DECLARE_INTERFACE ( MyPluginInterface, QtPluginDemo_iid ) ; #endif

    插件头文件 MyPlugin.h

    #ifndef MYPLUGIN__H
    #define MYPLUGIN__H
    
    #include <QObject>
    #include <QDebug>
    #include "MyPluginInterface.h"
    
    
    class MyPlugin : public QObject, public MyPluginInterface
    {
        Q_OBJECT
        Q_PLUGIN_METADATA ( IID QtPluginDemo_iid FILE "MyPlugin.json")
        Q_INTERFACES(MyPluginInterface)
    
    public:
    	int add(int,int);
    };
    
    #endif

    插件源文件 MyPlugin.cpp

    #include "MyPlugin.h"
    
    int MyPlugin::add(int a , int b)
    {
    	return a+b ;
    }
    
    #include "moc_MyPlugin.cpp"


    JSON文件 MyPlugin.json,本演示样例中该文件是空的。

    project文件 MyPlugin.pro

    TEMPLATE      = lib
    CONFIG       += plugin console
    QT           += core
    HEADERS       = MyPlugin.h MyPluginInterface.h
    SOURCES       = MyPlugin.cpp
    OTHER_FILES   = MyPlugin.json
    TARGET        = MyPlugin
    DESTDIR       = ./
    INCLUDEPATH  += ./
    # install
    target.path = ./install
    INSTALLS += target



    应用程序代码

    接口类头文件 MyPluginInterface.h,该文件与插件代码中的一致。

    主程序文件 main.cpp

    #include "MyPluginInterface.h"
    #include <QtPlugin>
    #include <QApplication>
    #include <QWidget>
    #include <QPluginLoader>
    #include <QString> 
    #include <QtDebug>
    
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    	QWidget w;
    	QObject* object ;
    	w.show();
    	
    	app.addLibraryPath(QString("../MyPlugin/install"));	// 加入库路径
    	// 载入插件,取得实例
    	QPluginLoader l(QString("MyPlugin")) ;
    	//QPluginLoader l(QString("libMyPlugin.so")) ;
    
    	if ( (object=l.instance()) != NULL )
    	{
    		qDebug("plugin loaded .");
    		// 使用插件
    		int a = 14 , b = 23 ;
    		MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(object) ;
    		if (plugin)
    			qDebug("%d + %d = %d",a,b,plugin->add(a,b));
    	}
    	else
    	{
    		qDebug("failed to load plugin !! ");
    		QString errorStr = l.errorString();
    		qDebug()<<errorStr;
    	}
    	return app.exec();
    }
    
    

    MyApp.pro

    ######################################################################
    # Automatically generated by qmake (3.0) ?

    ? 11? 19 02:26:33 2014 ###################################################################### TEMPLATE = app QT += gui core widgets CONFIG += console TARGET = MyApp INCLUDEPATH += . # Input HEADERS += MyPluginInterface.h SOURCES += main.cpp



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    数据类型转换:高级向低级转换可能出现的问题和取得不同精度的方法
    Xen Server虚拟机数据恢复的方法和数据恢复过程
    VMware虚拟机误删除vmdk文件后如何恢复?
    MSSQL 2000 错误823恢复
    服务器存储误操作导致数据丢失的恢复过程
    我从业11年来遇到的最奇葩的raid0+1数据恢复经历
    Raid 5数据恢复原理以及raid 5数据恢复实际操作案例
    服务器数据恢复_Linux网站服务器故障数据恢复案例
    Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享
    V7000存储数据恢复_底层结构原理拆解及Mdisk磁盘掉线数据恢复方法
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4661110.html
Copyright © 2011-2022 走看看