1. 程式人生 > >Qt中建立一個簡單的外掛

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();
}