Qt中创建一个简单的插件

通过看官方的示例代码,参考示例echoplugin,总结插件的创建步骤如下

1.定义一个插件接口,在接口外部定义插件的标识符iid,并用宏声明接口

#define ECHOINTERFACE_H

#include <QString>

//! [0]
class EchoInterface
{
public:
    virtual ~EchoInterface() {}
    virtual QString echo(const QString &message) = 0;
};


QT_BEGIN_NAMESPACE

#define EchoInterface_iid "org.qt-project.Qt.Examples.EchoInterface"

Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_iid)
QT_END_NAMESPACE

//! [0]
#endif

2. 在插件工程的pro文件里加入以下关键语句,其中的echoplugin.json是一个空文件

TEMPLATE        = lib
CONFIG         += plugin
EXAMPLE_FILES = echoplugin.json
CONFIG += install_ok

示例中提供的pro完整文件如下

#! [0]
TEMPLATE        = lib
CONFIG         += plugin
QT             += widgets
INCLUDEPATH    += ../echowindow
HEADERS         = echoplugin.h
SOURCES         = echoplugin.cpp
TARGET          = $$qtLibraryTarget(echoplugin)
DESTDIR         = ../plugins
#! [0]

EXAMPLE_FILES = echoplugin.json

# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/echoplugin/plugins
INSTALLS += target

CONFIG += install_ok  # Do not cargo-cult this!

3. 新建一个插件类,继承自QObject和插件接口,在类中声明使用宏Q_PLUGIN_METADATA 和Q_INTERFACES,重写插件接口中的方法。

#ifndef ECHOPLUGIN_H
#define ECHOPLUGIN_H

#include <QObject>
#include <QtPlugin>
#include "echointerface.h"

//! [0]
class EchoPlugin : public QObject, EchoInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" FILE "echoplugin.json")
    Q_INTERFACES(EchoInterface)

public:
    QString echo(const QString &message) override;
};
//! [0]

#endif

4. 以上就是插件工程的步骤,在使用插件时,先加载插件,得到一个QObject的指针,再转换为插件接口类型,最后就可以调用插件中的方法。以下代码是参照示例代码得到的简化版,删除了其他无关代码。

#include <QCoreApplication>
#include <QDir>
#include <QPluginLoader>
#include <QDebug>

#include "echo_interface.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    echo_interface *echoInterface = nullptr;
    
    // 插件的路径
    QPluginLoader pluginLoader("C:/Users/dell/Documents/build-plugintest-Desktop_Qt_5_9_2_MinGW_32bit-Debug/plugin_tst/debug/plugin_tst.dll");
    QObject *plugin = pluginLoader.instance();
    if (plugin) {
        echoInterface = qobject_cast<echo_interface *>(plugin);
    }
    // 调用插件中的方法
    QString str = echoInterface->echo("abc");
    qDebug() << str; // abc

    return app.exec();
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值