简述
这个插件管理系统,主要是查找指定文件中的插件。并在工具栏中为每一个插件自动生成一个动作,当动作被触发时,加载指定插件。
工程文件
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);
}