Qt 插件的编译、加载

落日映苍穹つ 2022-05-24 07:47 461阅读 0赞

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

步骤:

1·新建项目,选择 Library

这里写图片描述

2.选择C++库

这里写图片描述

3.选择 Qt Plugin
这里写图片描述

  1. 这里写图片描述

5.此时,彻底删除

secondplugin.cpp
SecondPlugin.json两个文件

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

这里写图片描述

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

  1. #ifndef INTERFACE
  2. #define INTERFACE
  3. #include <QObject>
  4. class AppInterface
  5. {
  6. public:
  7. virtual ~AppInterface() {}
  8. virtual QString name() = 0;
  9. virtual QWidget *widget() = 0;
  10. private:
  11. QString m_libDir;
  12. public:
  13. QString libDir(){
  14. return m_libDir.isEmpty()?"./":m_libDir;}
  15. void setLibDir(QString libDir){m_libDir = libDir;}
  16. };
  17. QT_BEGIN_NAMESPACE
  18. #define Interface_iid "com.xxxx.Interface"
  19. Q_DECLARE_INTERFACE(AppInterface, Interface_iid)
  20. QT_END_NAMESPACE
  21. #endif // INTERFACE

7修改secondplugin.h为

  1. #ifndef SECONDPLUGIN_H
  2. #define SECONDPLUGIN_H
  3. #include "appinterface.h"
  4. #include "secondform.h"
  5. class SecondPlugin : public QObject, AppInterface {
  6. Q_OBJECT
  7. Q_PLUGIN_METADATA(IID "com.xxxx.Interface")
  8. Q_INTERFACES( AppInterface )
  9. public:
  10. QString name(){ return QStringLiteral("Second模块"); }
  11. QWidget* widget(){ return new SecondForm(); }
  12. };
  13. #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. 这里写图片描述

2
这里写图片描述
3
这里写图片描述

  1. 修改mainwindow.cpp

    include “mainwindow.h”

    include “ui_mainwindow.h”

    include “appinterface.h”

    include

    include

    include

    include

    MainWindow::MainWindow(QWidget *parent) :

    1. QMainWindow(parent),
    2. ui(new Ui::MainWindow)

    {

    1. ui->setupUi(this);
    2. //在这里,将插件加载到QTabWidget中
    3. QTabWidget *tabs = new QTabWidget(this);
    4. setCentralWidget(tabs);
    5. QList<AppInterface*> widgetList;
    6. //加载exe所在目录下 plugin文件夹的所有插件
    7. QDir pluginsDir(qApp->applicationDirPath()+ "/plugin");
    8. foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
    9. QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
    10. QObject *plugin = pluginLoader.instance();
    11. if (plugin) {
    12. AppInterface *app = qobject_cast<AppInterface*>(plugin);
    13. if (app)
    14. {
    15. widgetList.append(app);
    16. }
    17. }
    18. }
  1. if( widgetList.isEmpty() ){
  2. QMessageBox::warning(this, "Warning", "load plugin error \n");
  3. }else{
  4. foreach (AppInterface *w, widgetList) {
  5. tabs->addTab(w->widget(), w->name());
  6. }
  7. }
  8. }
  9. MainWindow::~MainWindow()
  10. {
  11. delete ui;
  12. }

可以在两个插件之间任意切换
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,461人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图片预开发小记

    面向对象组件开发前端进阶不可或缺的一步,复用思想也是前端模块化的重要推动力 图片预加载在大批量图片加载的同时保证用户体验方面作用明显,浅显尝试,以此为记 插件封装(preL

    相关 BurpsuiteSQLMAP

    一直是将Burpsuite和SQLMap分开来进行处理工作的,但最近发现很多人都说可以将Sqlmap一起加载到burpsuite上面工作,工作效率会好很多。在网上看到很多这方面