Qt 插件的编译、加载

************************* 插件编译************************

步骤:

1·新建项目,选择 Library

Qt 插件的编译、加载_第1张图片

2.选择C++库

Qt 插件的编译、加载_第2张图片

3.选择 Qt Plugin
Qt 插件的编译、加载_第3张图片
4.
Qt 插件的编译、加载_第4张图片

5.此时,彻底删除

secondplugin.cpp
SecondPlugin.json两个文件

6 新建一个类,我新建了一个设计师界面类 SecondForm,
在SecondForm类实现插件的界面和功能等

Qt 插件的编译、加载_第5张图片

7 导入插件接口文件 appinterface.h
该文件是自己写的一个接口,可以自己定义,如下

#ifndef INTERFACE
#define INTERFACE

#include 

class AppInterface
{
public:
    virtual ~AppInterface() {}
    virtual QString name() = 0;
    virtual QWidget *widget() = 0;


private:
    QString m_libDir;

public:
    QString libDir(){return m_libDir.isEmpty()?"./":m_libDir;}
    void setLibDir(QString libDir){m_libDir = libDir;}

};


QT_BEGIN_NAMESPACE

#define Interface_iid "com.xxxx.Interface"

Q_DECLARE_INTERFACE(AppInterface, Interface_iid)

QT_END_NAMESPACE

#endif // INTERFACE

7修改secondplugin.h为

#ifndef SECONDPLUGIN_H
#define SECONDPLUGIN_H

#include "appinterface.h"
#include "secondform.h"

class SecondPlugin : public QObject, AppInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "com.xxxx.Interface")
    Q_INTERFACES( AppInterface )

public:
    QString name(){ return QStringLiteral("Second模块"); }
    QWidget* widget(){ return new SecondForm(); }
};

#endif // SECONDPLUGIN_H

编译 会生成一个SecondPlugin.dll文件

注:
1 如果报错 : error: Unknown module(s) in QT: QWidgets
在pro中添加 QT += widgets

2.如果没有dll生成,查看pro 发现 DESTDIR = $$[QT_INSTALL_PLUGINS]/generic
改为 DEFINES += IDPLUGIN_LIBRARY 即可

同理 编译一个FirstPlugin.dll

************************* 插件调用***************************

步骤
新建工程
1.
Qt 插件的编译、加载_第6张图片

2
Qt 插件的编译、加载_第7张图片
3
Qt 插件的编译、加载_第8张图片

  1. 修改mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "appinterface.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //在这里,将插件加载到QTabWidget中
    QTabWidget *tabs = new QTabWidget(this);
    setCentralWidget(tabs);

    QList widgetList;

    //加载exe所在目录下  plugin文件夹的所有插件
    QDir pluginsDir(qApp->applicationDirPath()+ "/plugin");

    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();
        if (plugin) {
            AppInterface *app = qobject_cast(plugin);
            if (app)
            {
                widgetList.append(app);
            }
        }
    }


    if( widgetList.isEmpty() ){
        QMessageBox::warning(this, "Warning", "load plugin error \n");
    }else{
        foreach (AppInterface *w, widgetList) {
            tabs->addTab(w->widget(), w->name());
        }
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

可以在两个插件之间任意切换
Qt 插件的编译、加载_第9张图片

你可能感兴趣的:(Qt 插件的编译、加载)