qt插件元数据不包含一个有效的元数据_Qt5个人软件插件使用(低级API)
前言
今天想看一些Qt 插件系統。看了之后發現Qt支持兩種插件方式:高級 API 和低級 API。
高級 API 指的的為Qt軟件本身定制插件;
低級 API 指的是為自己寫的軟件定制插件。
這篇文章主要講的是如何編寫使用一個低級 API,文章屬于入門級的,只是簡單使用。
Qt 插件和動態庫區別(查找的)
Qt 插件本身是動態庫,除此之外,它定義了一組專用的接口,從動態庫中導出,供?Qt?的插件管理體系發現和調用。當你選擇?Qt?插件項目模板時,?Qt?Creator?會自動為你插入專用接口相關的模板代碼。
假如你從一個白板做起,實現一個動態庫,要想客戶方調用,還是需要導出 N 多的函數。而?Qt?這種,只是它約定了你需要導出什么函數、什么類、怎樣查詢你導出的接口,它定義了一套規范而已。
新建一個插件
1.? 新建一個 C++庫
2. 選擇 Qt Plugin
3. Qt 插件名稱,我這里是默認的根據需求來。下面的基類還沒有研究過
編寫插件代碼(不要忘記看注釋)
1. 新建一個頭文件,作為插件導出的接口頭文件。命名為: TestPluginBase.h。代碼如下。
#ifndef TESTPLUGINBASE_H
#define TESTPLUGINBASE_H
class TestPluginBase
{
public:
virtual ~TestPluginBase() {}
virtual void test() = 0;
};
// Q_DECLARE_INTERFACE 告訴 Qt 這個純虛類是一個插件接口類。
// 第一個參數: 接口類名
// 第二個參數: 插件標識符,標識符大小寫敏感且必須唯一
Q_DECLARE_INTERFACE(TestPluginBase, "org.qt-project.Qt.QGenericPluginFactoryInterface/1.0")
#endif // TESTPLUGINBASE_H
2.? 插件文件繼承:QObject 和 TestPluginBase
頭文件: GenericPlugin.h
#ifndef GENERICPLUGIN_H
#define GENERICPLUGIN_H
#include
#include
#include "testpluginbase.h"
class GenericPlugin : public QObject, public TestPluginBase
{
Q_OBJECT
// 調用此宏之前必須存在一個 Q_DECLARE_INTERFACE 聲明的相應接口
Q_INTERFACES(TestPluginBase)
#if QT_VERSION >= 0x050000
// Q_PLUGIN_METADATA 用于描述插件元數據
// 第一個參數: IID 必須的
// 第二個參數: FILE 可選的用于描述插件的相關信息
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface/1.0" FILE "TestPlugin.json")
#endif // QT_VERSION >= 0x050000
public:
GenericPlugin();
// 插件調用的方法。
// Q_DECL_OVERRIDE 用來聲明這是一個對虛函數進行定義
// 的方法,編譯器會驗證該方法名是否是否父類中所有的,如果沒有則報錯 Q_DECL_OVERRIDE
void test();
};
#endif // GENERICPLUGIN_H
CPP 文件
#include "genericplugin.h"
#include
GenericPlugin::GenericPlugin()
{
}
void GenericPlugin::test()
{
qDebug() << "[" << __FUNCTION__ <<__line__ : qt plugin>
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(TestPlugin, GenericPlugin)
#endif // QT_VERSION < 0x050000
TestPlugin.json
{
"Keys" : [ ],
// 以下信息是我自己定義的
"Name" : "測試插件",
"Desc" : "插件描述",
"Author": "HBQ",
"HomeUrl": "https://itzhai.cn",
"UseDesc": "使用描述"
}
Pro 文件修改
# DESTDIR = $$[QT_INSTALL_PLUGINS]/generic
DESTDIR = $$PWD/bin // jiang 將上面的注釋修改成下面的 fangbian 方便找
3. 點擊工程運行,生成插件。注意看是否生成 dll 文件。
插件的使用
1. 新建一個 Qt 控制臺程序,復制 TestPluginBase.h 頭文件到新建的控制臺項目,結構如下
2. 插件使用代碼
#include
#include
#include
#include
#include "testpluginbase.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDir dir;
dir.setPath("./plugins");
if(!dir.exists()) { qDebug() << "[" << __FUNCTION__ <<__line__ : path no exist return>
foreach (QString filename, dir.entryList(QDir::Files)) {
qDebug() << "[" << __FUNCTION__ <<__line__ : dir.absolutefilepath>
QPluginLoader *loader = new QPluginLoader(dir.absoluteFilePath(filename));
if(!loader->load())
{
qWarning("%s is not a plugin",qPrintable(dir.absoluteFilePath(filename)));
continue;
}
QObject *obj = loader->instance();
TestPluginBase *plugin = qobject_cast(obj);
plugin->test(); // 調用插件方法
qDebug() << "[" << __FUNCTION__ <<__line__ : loader->metaData(); // 解析 json 文件
}
return a.exec();
}
3. 在軟件運行的 Debug 目錄上層新建一個 plugins 文件,將插件 dll 放入其中
4. 運行測試程序
總結
仔細詳細那插件還是很有用的。雖然目前還沒用到,但是一直還是想看,接下來去看看高級 API,Qt 自己的插件。這里只是簡單使用,我也很菜,如有誤導可以在下方留言噴我。
IT宅個人博客 , 版權所有丨如未注明 , 均為原創丨本網站采用BY-NC-SA協議進行授權
轉載請注明原文鏈接:Qt5個人軟件插件使用(低級API)
總結
以上是生活随笔為你收集整理的qt插件元数据不包含一个有效的元数据_Qt5个人软件插件使用(低级API)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人贷款申请条件是什么
- 下一篇: 支付宝会员签到在哪里