日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt插件元数据不包含一个有效的元数据_Qt5个人软件插件使用(低级API)

發布時間:2024/10/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。