Qt中建立一個簡單的外掛
阿新 • • 發佈:2019-02-03
通過看官方的示例程式碼,參考示例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();
}