Qt中创建一个简单的插件

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

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

#define ECHOINTERFACE_H

#include 

//! [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 
#include 
#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 
#include 
#include 
#include 

#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(plugin);
    }
    // 调用插件中的方法
    QString str = echoInterface->echo("abc");
    qDebug() << str; // abc

    return app.exec();
}

 

你可能感兴趣的:(qt)