Qt 插件的编译、加载
\************************* 插件编译\************************
步骤:
1·新建项目,选择 Library
2.选择C++库
3.选择 Qt Plugin
5.此时,彻底删除
secondplugin.cpp
SecondPlugin.json两个文件
6 新建一个类,我新建了一个设计师界面类 SecondForm,
在SecondForm类实现插件的界面和功能等
7 导入插件接口文件 appinterface.h
该文件是自己写的一个接口,可以自己定义,如下
#ifndef INTERFACE
#define INTERFACE
#include <QObject>
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
\************************* 插件调用\***************************
步骤
新建工程
2
3
修改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<AppInterface*> 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<AppInterface*>(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;
}
可以在两个插件之间任意切换
还没有评论,来说两句吧...