Qt--QPlugin插件

这篇具有很好参考价值的文章主要介绍了Qt--QPlugin插件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

Qt–动态链接库一文中提到,动态方式加载dll只能加载 extern "C“ 的导出函数,而无法加载类,因此可以使用Qt提供的插件来实现导出类的动态加载。

QPlugin是Qt插件框架的一部分,是一种轻量级的插件系统,用于在QT应用程序中动态加载和卸载功能模块,QPluginLoader类提供了对Qt插件的访问。

开发环境:
Qt5.15.2
Qt Creator10.0.2

自定义插件步骤

自定义插件时,要先创建一个接口,作为插件类的基类。因为插件存储在一个dll中,因此可以动态的加载。

创建一个插件包含以下几步:
①定义一个接口类(只有纯虚函数的抽象类)
②使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口
③再定义一个插件类,必须继承自QObject类和上面创建的接口类,且需先继承QObject
④在插件类中使用Q_INTERFACE()宏在Qt的元对象系统中注册该接口
⑤使用Q_PLUGIN_METADATa()宏导出该插件
⑥使用合适的.pro文件构建该插件

这里和之前的dll的创建和使用一样,同样以两个项目进行,一个插件项目,一个使用插件项目。

创建插件

打开Qt Creator,新建空项目,Empty qmake Project。
Qt--QPlugin插件,QT,qt,开发语言

命名为:MyPlugin
Qt--QPlugin插件,QT,qt,开发语言
套件配置:
Qt--QPlugin插件,QT,qt,开发语言

新建一个MyPluginInterface 接口类:
Qt--QPlugin插件,QT,qt,开发语言
在MyPluginInterface.h中添加以下内容:

//myplugininterface.h
#ifndef MYPLUGININTERFACE_H
#define MYPLUGININTERFACE_H

#define MYPLUGININTERFACE_IID "org.examples.myplugin.interface”

class MyPluginInterface
{
public:
    virtual ~MyPluginInterface() {}     //这里需内敛实现
    virtual void printFromPlugin() = 0; //声明为纯虚函数

};

Q_DECLARE_INTERFACE(MyPluginInterface, MYPLUGININTERFACE_IID)

#endif // MYPLUGININTERFACE_H

再创建插件类,继承自QObject:
Qt--QPlugin插件,QT,qt,开发语言
Qt--QPlugin插件,QT,qt,开发语言
添加对QMyPluginInterface的继承,元对象的接口注册和导出:

//myplugin.h
#ifndef MYPLUGIN_H
#define MYPLUGIN_H

#include <QObject>
#include "MyPluginInterface.h"

class MyPlugin : public QObject, MyPluginInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID MYPLUGININTERFACE_IID)
    Q_INTERFACES(MyPluginInterface)

public:
    explicit MyPlugin(QObject *parent = nullptr);

    void printFromPlugin();     //实现继承自基类的纯虚函数

signals:

};

#endif // MYPLUGIN_H

//myplugin.cpp
#include "myplugin.h"
#include <QDebug>

MyPlugin::MyPlugin(QObject *parent)
    : QObject{parent}
{

}

void MyPlugin::printFromPlugin()
{
    qDebug() << "Print From Plugin";
}

最后修改.pro文件,构建项目:

//MyPlugin.pro
TEMPLATE = lib      #表明该项目要构建库
CONFIG += plugin    #告知qmake要创建一个插件


HEADERS += \
    MyPluginInterface.h \
    myplugin.h

SOURCES += \
    myplugin.cpp

构建会提示MyPluginInterface.h中有错误:D:\QtApplication\MyPlugin\MyPlugin\MyPluginInterface.h:15: error: Parameter type ‘MyPluginInterface’ is an abstract class
Qt--QPlugin插件,QT,qt,开发语言

这里将MyPluginInterface.h从项目中移除,注意不要删除!
Qt--QPlugin插件,QT,qt,开发语言

再重新构建生成即可:
Qt--QPlugin插件,QT,qt,开发语言
可以在输出目录下看到dll:
Qt--QPlugin插件,QT,qt,开发语言
然后提供:
①MyPluginInterface.h
②MyPlugin.dll

给其他项目使用即可。

使用插件

这里新建一个Qt控制台应用程序,来加载上面的插件并使用:
Qt--QPlugin插件,QT,qt,开发语言
Qt--QPlugin插件,QT,qt,开发语言
构建套件:
Qt--QPlugin插件,QT,qt,开发语言
将MyPluginInterface.h拷贝到MyPluginTest.pro目录的include文件夹中,将MyPlugin.dll放到MyPluginTest项目的输出目录下:
Qt--QPlugin插件,QT,qt,开发语言
Qt--QPlugin插件,QT,qt,开发语言
在MyPluginTest.pro中添加包含目录:
Qt--QPlugin插件,QT,qt,开发语言
在main.cpp中加载使用MyPlugin:

//main.cpp
#include <QCoreApplication>

#include <QDebug>
#include <QPluginLoader>
#include "MyPluginInterface.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //QPluginLoader loader("D:/QtApplication/MyPluginTest/build-MyPluginTest-Desktop_Qt_5_15_2_MSVC2019_64bit-Release/MyPlugin.dll");
    QPluginLoader loader("../MyPlugin.dll");

    QObject* instance = loader.instance();
    if (instance)
    {
        MyPluginInterface* plugin = qobject_cast<MyPluginInterface*>(instance);
        if (plugin)
        {
            plugin->printFromPlugin();
        }
    }
    else
    {
        qDebug() << "Instance is null";
        return 0;
    }



    return a.exec();
}

输出结果如下:
Qt--QPlugin插件,QT,qt,开发语言

总结

使用QPluginLoader可动态加载dll,通过QPluginLoader::instance()得到插件接口类的实例,再通过多态调用对应插件类的接口实现,以此来弥补QLibrary不能动态加载使用导出类的缺陷。

后续扩展其他插件时,需添加抽象的插件接口类(MyPluginInterface)及其对应的插件类(MyPlugin)实现。文章来源地址https://www.toymoban.com/news/detail-637232.html

到了这里,关于Qt--QPlugin插件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT支持多种开发语言

    QT主要是一个C++应用程序框架,但它也提供了对其他一些编程语言的官方或非官方支持。以下是QT支持的一些语言版本及其特点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Python (PyQt)  : PyQt是QT的官方Python绑定,允许Python开发者使用QT库来创建

    2024年04月29日
    浏览(48)
  • 12-2_Qt 5.9 C++开发指南_自定义Qt Designer 插件(UI 设计器自定义界面组件的 Widget 插件,直接安装到 UI设计器组件面板里,如同 Qt 自带的界面设计组件一样)

    上篇使用提升法(promotion)来创建自定义组件,本篇为 UI 设计器设计自定义界面组件的 Widget 插件,直接安装到 UI设计器的组件面板里,如同 Qt 自带的界面设计组件一样使用,在设计时就能看到组件的实际显示效果,只是编译和运行时需要使用到插件的动态链接库 (Windows 平台上

    2024年02月05日
    浏览(52)
  • QGIS二次开发六:VS不借助QT插件创建UI界面

    上一篇博客我们说了在VS中如何使用QT插件来创建UI界面,但是我们二次开发QGIS的第一篇博客就说了,最好使用OSGeo4W中自动下载的QT进行QGIS二次开发,这样兼容性是最好的,那么该如何在VS中不使用外部安装的QT以及QT的VS插件情况下进行UI界面的创建和使用呢? 如果你仔细看完

    2024年02月13日
    浏览(37)
  • 【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标:干掉它。 战术路线:Qt 绘图可以使用 Qt Charts,先了解

    2024年02月11日
    浏览(49)
  • CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

    本文由CSDN点云侠原创,原文链接。爬虫网站自重。   手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。 1、将 ....pluginsexample 路径下的 ExamplePlugin 复制一份并修改名字为 CCPointCloudProcess 。 2、创建窗口UI文件 使用任意Qt工程新建对话

    2023年04月11日
    浏览(52)
  • 【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月10日
    浏览(76)
  • 【VisualStudio】基于 Visual Studio 使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月15日
    浏览(66)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(68)
  • 【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在添加 Widget 做

    2024年02月11日
    浏览(52)
  • 在visual studio里配置Qt插件并运行Qt工程

        Qt插件,也叫qt-vsaddin,它以*.vsix后缀名结尾。visual studio简称为VS,从visual studio 2010版本开始,VS支持Qt框架的开发,Qt以插件方式集成到VS里。这里简述在visual studio 2019里配置Qt 5.14.2插件,并配置Qt环境、编译和运行Qt工程。     下载VS2019,官网地址: https://visualstudio.mi

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包