Qt plugin 开发UI界面插件

目录

1.创建接口

2.创建插件

3.创建插件界面

4.插件实现

5.创建应用工程

6.应用插件


1.创建接口

打开QtCreater,点击左上角“文件”->新建文件或项目,在弹窗中选择C++/C++Header File。

输入文件名,选好路径(可自行设置名称,路径)。后面点击下一步,完成就可以了。

在创建的文件中输入以下内容

class MyPlugin : public QObject
{
    Q_OBJECT
public:
    virtual ~MyPlugin(){}
    virtual void msgToPlugin(int) = 0; //插件接收消息
signals:
    void msgFromPlugin(int);//插件发送消息
public:
    QWidget* widget; //插件界面接口指针
};
#define MyPlugin_IID "com.wyc.myplugin"
Q_DECLARE_INTERFACE(MyPlugin, MyPlugin_IID);//将接口告诉Qt元对象系统

2.创建插件

再次点击“文件”->新建文件或项目,选择Library/C++ Library,

输入名称和路径,其他没展示的,都选择默认,点下一步就可以了

添加上面生成的插件接口头文件

修改pro前几行

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = lib
DEFINES += TEST_PLUGIN_UI_LIBRARY
CONFIG += plugin
CONFIG += c++11

3.创建插件界面

在test_plugin_ui项目上点击右键,选择Add new...,选择设计师界面类,输入名称。

界面中添加控件,用来测试和主界面的通讯。

头文件加入如下内容:

signals:
    void sendMsg(int);//发送消息
public slots:
    void recMsg(int); //接收消息
private slots:
    void on_send_clicked();

在cpp文件中实现相应的收发功能。

至此插件界面就做好了。

4.插件实现

在之前创建的test_plugin_ui.h中加入头文件:

#include "myplugin.h"
#include "pluginwidget.h"

在类中加入如下内容:

class TEST_PLUGIN_UI_EXPORT Test_plugin_ui : public MyPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "com.wyc.myplugin")
    Q_INTERFACES(MyPlugin)
public:
    Test_plugin_ui();
    ~Test_plugin_ui();
    void msgToPlugin(int); //接收消息
private:
    PluginWidget * m_pluginWidget = 0;
};

在cpp中初始化m_pluginWidget,并将其赋值给widget,外部界面可以通过widget指针使用插件里的界面.

m_pluginWidget = new PluginWidget;
widget = m_pluginWidget;
QObject::connect(m_pluginWidget, &PluginWidget::sendMsg, this, &Test_plugin_ui::msgFromPlugin);

实现函数void msgToPlugin(int)后,点击编译图标,即可生成.dll,.a文件

5.创建应用工程

创建应用工程

编译器一定要选跟上面一样的,其他都点“下一步”。

在ui文件中添加控件如下

右侧的布局用来添加插件界面。

6.应用插件

将上面生成的.dll和.a两个文件拷贝到相应的目录,比如Debug,就拷贝到build-...-Debug下,Release就拷贝到build-...-Release下。

将接口文件myplugin.h添加到工程中。

在头文件mainwindow.h中添加如下内容:

#include "myplugin.h"
public slots:
    void rectMsg(int value);
private slots:
    void on_sendBtn_clicked();
private:
    MyPlugin *m_plugin;

在mainwindow.cpp构造函数中添加如下内容:   

    if(!QLibrary::isLibrary(("test_plugin_ui.dll"))){
        qDebug()<<"not a library";
        return;
    }
    QDir dir("./test_plugin_ui.dll");
    qDebug()<<__LINE__ << dir.absolutePath();
    QPluginLoader loader(dir.absolutePath());
    loader.load();
    qDebug() << loader.errorString();
    m_plugin = qobject_cast<MyPlugin*>(loader.instance());
    if(m_plugin){
        ui->verticalLayout->addWidget(m_plugin->widget);
        connect(m_plugin, &MyPlugin::msgFromPlugin, this, &MainWindow::rectMsg);
    }else{
        qDebug()<<__LINE__ << "error";
    }

并在cpp文件中实现相应的收发功能,运行即可。

相关推荐

  1. Wireshark开发

    2024-04-11 15:22:04       30 阅读
  2. blender开发

    2024-04-11 15:22:04       40 阅读
  3. vscode:开发

    2024-04-11 15:22:04       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 15:22:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 15:22:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 15:22:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 15:22:04       18 阅读

热门阅读

  1. 蓝桥杯---蜗牛

    2024-04-11 15:22:04       10 阅读
  2. python学习——re库的常用函数

    2024-04-11 15:22:04       10 阅读
  3. SQL Server 多表联合更新方法

    2024-04-11 15:22:04       13 阅读
  4. 2. WPF显示一个启动画面(欢迎屏幕)

    2024-04-11 15:22:04       12 阅读
  5. 缓存、分布式缓存、缓存的风险

    2024-04-11 15:22:04       12 阅读
  6. Linux下的链接文件

    2024-04-11 15:22:04       12 阅读
  7. linux SSH 服务管理命令

    2024-04-11 15:22:04       10 阅读
  8. 清空nginx缓存并强制刷新

    2024-04-11 15:22:04       10 阅读
  9. Bash 编程精粹:从新手到高手的全面指南之变量

    2024-04-11 15:22:04       12 阅读
  10. [Linux][shell][权限] shell原理简介 + 权限细节笔记

    2024-04-11 15:22:04       10 阅读
  11. 知识碎片随手记-1

    2024-04-11 15:22:04       11 阅读