ToolBox · 简易插件管理系统

6 篇文章 0 订阅
6 篇文章 0 订阅

Qt 插件 《 ToolBox 》目录


简述

这个插件管理系统,主要是查找指定文件中的插件。并在工具栏中为每一个插件自动生成一个动作,当动作被触发时,加载指定插件。

工程文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = App
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        mainwindow.cpp \

HEADERS += \
        mainwindow.h \

FORMS += \
        mainwindow.ui

DESTDIR = ../bin

INCLUDEPATH += $$PWD/../PluginWidget

INCLUDEPATH += $$PWD/../MyShareLibrary
LIBS += -L../bin/ -lMyShareLibrary

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QPluginLoader;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void slot_newInstance();

private:
    Ui::MainWindow *ui;

    QPluginLoader *loader;
};

#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "pluginwidget.h"
#include <QDir>
#include <QDebug>
#include <QAction>
#include <QLibrary>
#include <QFileInfo>
#include <QJsonObject>
#include <QPluginLoader>

QHash<QString, QString> pluginPath;
QList<PluginWidget*> plugins;

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

    loader = new QPluginLoader(this);

    QDir pluginDir;
    pluginDir.setPath(qApp->applicationDirPath());
    pluginDir.cd("plugins");

    for(QFileInfo info : pluginDir.entryInfoList(QStringList("*.dll"), QDir::Files)) {

        if (!QLibrary::isLibrary(info.absoluteFilePath()))
            continue;

        loader->setFileName(info.absoluteFilePath());
        //获取插件元数据
        QJsonObject json = loader->metaData().value("MetaData").toObject();
        QString name = json.value("name").toString();
        //新建工具栏的一个动作
        QAction *action = new QAction(name, ui->mainToolBar);
        action->setObjectName(name);
        ui->mainToolBar->addAction(action);
        connect(action, &QAction::triggered, this, &MainWindow::slot_newInstance);

        pluginPath.insert(name, info.absoluteFilePath());
        loader->unload();
    }
}

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

void MainWindow::slot_newInstance()
{
    QString path;
    QAction *action;
    PluginWidget *plugin;

    action = qobject_cast<QAction*>(sender());
    path = pluginPath.value( action->objectName());
    loader->setFileName(path);

	//获取插件实例
    plugin = qobject_cast<PluginWidget *>(loader->instance());
    if(Q_NULLPTR == plugin) {
        qDebug()<< "error: " << action->objectName();
        return ;
    }

    plugin = plugin->newObj();
    ui->mdiArea->addSubWindow(plugin);
    plugin->show();
    plugins.append(plugin);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值