Qt 建立應用程式外掛
前言
本文Qt中建立應用程式的外掛主要有兩方面:
一、建立外掛
二、在應用程式中使用外掛
一、建立外掛
先用文字描述一下建立外掛的主要步驟
①、首先新建一個外掛的介面類,這個類只包含純虛擬函式,這個純虛擬函式是用於給介面類實現具體功能的。並在介面類中使用Q_DECLARE_INTERFACE()巨集在Qt的元物件系統中註冊該介面。
②、新建一個外掛類,這個外掛類一定要繼承QObject 和①中新建好的介面類,並要求實現介面類的純虛擬函式(即這個外掛所需要實現的功能)。並使用 Q_PLUGIN_METADATA()巨集匯出外掛、Q_INTERFACES()在Qt的元物件系統中註冊該介面。
③、編寫好.pro檔案,用於編譯構建生成.so檔案。
下面具體程式碼實現建立外掛
1、新建外掛的介面類
//PluginInterface.h
#ifndef PLUGININTERFACE
#define PLUGININTERFACE
#include <QString>
class PluginInterface
{
public:
virtual ~PluginInterface(){}
virtual QString regexp(const QString &message) = 0;
};
Q_DECLARE_INTERFACE(PluginInterface,"pluginInterface" ) // Q_DECLARE_INTERFACE()在Qt元物件系統中註冊了該介面,其中第一個引數為介面類名,第二個引數為一個字串,用來確保這個介面與其他介面不相同
/*Q_DECLARE_INTERFACE 巨集告訴Qt 這個純虛類是一個外掛介面類。
Q_DECLARE_INTERFACE 巨集是與qobject_cast相關的。
第一個引數是介面類名,第二個引數是外掛標誌符,識別符號是大小寫敏感的且必須是唯一。*/
#endif // PLUGININTERFACE
2、新建外掛類
// MyPlugin.h
#ifndef MYPPLUGIN_H
#define MYPPLUGIN_H
#include <QObject>
#include "plugininterface.h"
class MyPlugin:public QObject,PluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "myplugin") //匯出外掛 (ps:Q_EXPORT_PLUGIN2()巨集已經廢棄,用時會報錯,所以用Q_PLUGIN_METADATA()),第一個引數IID是必須的,同外掛標識一樣,而第二個引數FILE是可選的.
Q_INTERFACES(PluginInterface) //在Qt的元物件系統中註冊該介面
public:
QString regexp(const QString &message) Q_DECL_OVERRIDE; // 實現介面類的純虛擬函式,這裡功能是輸出字串中出現的的第一個數字
};
/*
Q_PLUGIN_METADATA : Q_PLUGIN_METADATA 巨集用於描述外掛元資料,第一個引數 IID 是必須的,同外掛識別符號一樣,
而第二個引數FILE是可選的,指定一個本地的 json 檔案,該檔案可以描述外掛的相關資料資訊。
Q_INTERFACES :若一個頭檔案或原始檔中用到了 Q_INTERFACES 巨集,那麼在呼叫這個巨集之前,
必須存在一個 Q_DECLARE_INTERFACE 巨集宣告相應的介面
(或者包含一個用 Q_DECLARE_INTERFACE 巨集聲明瞭該介面的標頭檔案),
MOC會檢查這一點,因為它在為 Q_INTERFACES 巨集生成程式碼時要用到Q_DECLARE_INTERFACE 巨集的 IID 引數。
Q_INTERFACES巨集也是與qobject_cast相關,沒有 Q_DECLARE_INTERFACE 和 Q_INTERFACES 這兩個巨集,
就無法對從外掛中獲取的例項指標進行qobject_cast對映
Q_DECL_OVERRIDE :Q_DECL_OVERRIDE 巨集來宣告這是一個對虛擬函式進行定義的方法
,編譯器會驗證該方法名是否是父類中所有的,如果沒有則報錯(這個類似 Java裡的 @Override 註解)。
*/
#endif // MYPPLUGIN_H
//myPlugin.cpp
#include "myPlugin.h"
#include <QRegExp>
#include <QtPlugin>
QString myPlugin::regexp(const QString &message)
{
QRegExp rx("\\d+");
rx.indexIn(message);
QString str = rx.cap(0);
return str;
}
3、配置.pro檔案
HEADERS += regexpplugin.h regexpinterface.h //用到的.h檔案
SOURCES += regexpplugin.cpp //用到的.cpp檔案
TEMPLATE = lib //表明要構建的是庫檔案,而不是可執行檔案(TEMPLATE = app)
CONFIG += plugin //告知qmake要建立一個外掛
TARGET = mypplugin //生成庫的名字 (mypplugin.so)
DESTDIR = ../plugins //生成庫存放的位置
4、在專案中點選構建專案,這時可以看到plugins資料夾下生成了mypplugin.so檔案了,這個就是外掛,下面我們需要通過應用程式使用該外掛來實現功能。
二、在應用程式中使用外掛
應用程式主要實現的功能是:在QLineEdit中輸入一段字串,當點選一下QPushButton後,就會在QLabel中顯示在字串中出現的第一個數字。
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "plugininterface.h" //在上一步中寫好的外掛介面類
namespace Ui {
class widget;
}
class widget : public QWidget
{
Q_OBJECT
public:
explicit widget(QWidget *parent = 0);
~widget();
private slots:
void on_pushButton_clicked();
private:
Ui::widget *ui;
PluginInterface *pluginInterface;
bool loadPlugin(); // 載入外掛
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPluginLoader>
#include <QMessageBox>
#include <QDir>
widget::widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::widget)
{
ui->setupUi(this);
if(!loadPlugin()) // 載入外掛,如果外掛載入不成功則顯示提示框
{
QMessageBox::information(this,"Error","Could not load the plugin");
ui->lineEdit->setEnabled(false);
ui->pushButton->setEnabled(false);
}
}
widget::~widget()
{
delete ui;
}
bool widget::loadPlugin()
{
QDir pluginsDir("../plugins"); // 我的外掛存放在 ../plugins目錄下
foreach(QString fileName,pluginsDir.entryList(QDir::Files)) // 便利目錄下的所有普通檔案
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); //利用pluginLoader來載入外掛
QObject *plugin = pluginLoader.instance();//返回外掛的根元件物件。如果需要外掛會被載入。如果無法載入外掛,或者無法例項化根元件物件,則函式返回0。
if(plugin)
{
regexpInterface = qobject_cast<PluginInterface *>(plugin);//測試外掛是否實現了PluginInterface介面
if(regexpInterface) // 外掛載入成功
return true;
}
}
return false; // 沒有外掛或者外掛載入失敗
}
void widget::on_pushButton_clicked()
{
QString str = regexpInterface->regexp(ui->lineEdit->text());
ui->labelNum->setText(str);
}
3、執行結果如下所示
相關推薦
Qt 建立應用程式外掛
前言 本文Qt中建立應用程式的外掛主要有兩方面: 一、建立外掛 二、在應用程式中使用外掛 一、建立外掛 先用文字描述一下建立外掛的主要步驟 ①、首先新建一個外掛的介面類,這個類只包含純虛擬函式,這個純虛擬函式是用於給介面類實現具體功能的。並在介面
QT5建立應用程式外掛
主機環境:Windows XP QT版本:QT5.3.2 本文主要是根據Qt Creator快速入門中9.3.2建立應用程式外掛一節,文中是基於Qt4來編寫的,我這裡是用Qt5,有一點點區別,在此記錄下,以便查詢。 建立應用程式通過外掛擴充套件一般分為以下幾步: 1. 定義
建立應用程式設定
如何:建立應用程式設定 7年03月30日 轉(Microsoft):https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/advanced/how-to-create-application-settings
Django入門------------------------------------------建立應用程式
在安裝好Django框架的前提下,建立應用程式,一個Django專案是由一系列的應用程式組成的。 在終端窗口裡執行的runserver,再開啟一個終端視窗,切換到manage.py所在的目錄,啟用該虛擬環境,執行starapp APPname ,這個讓Django建立應用程式的所需的基礎設施。
QT | 設定應用程式名稱和主視窗標題
1、設定應用程式名稱 在工程檔案.pro檔案中,修改Target為想設定的名稱 TARGET = MXEditer 2、設定主視窗標題,在main檔案中,我的主視窗是MainWindow. int main(int argc, char *argv[]) { QAppli
適用於樹莓派Raspberry Pi的嵌入式QT平臺(二) -- 在Windows下用Qt Creator開發編譯Raspberry Qt 5應用程式
接著上篇 "",我們已經成功在Windows上交叉編譯了Raspberry Pi的嵌入式Qt 5.5。那麼我們就可以開始開發基於Qt 5的應用程式。接下來,我們需要在Windows上搭建必要的Qt開發工具,首當其衝就是官方的Qt Creator,不僅提供了原生的C++編輯器,Qt介面設計器,而且還可以整合現有
VS2013 如何建立應用程式圖示
簡述 本教程以 VS2013 為例,VS的其他版本,其步驟與之類似。 教程包括新增啟動圖示和新增視窗圖示。 新增啟動圖示 新增資源 匯入 Icon 選擇 Ico
win32建立應用程式的系統托盤圖示
前段時間工作需要,做了一個應用程式並且是要帶有系統托盤圖示的,雖然網上還是有很多的相關程式碼介紹,但是這裡還是想寫一下,做一個記錄吧,簡單介紹下過程以及API的呼叫步驟。 我寫的這個是基於一個模態對話方塊的:開始呢定義出我們要用的變數 NOTIFYI
Android應用程式外掛化研究之資源衝突
最近在研究Android應用的外掛化開發, 外掛化都是在解決以下幾個問題: 本章我們來研究最後一個問題:資源共享與衝突。在《Android應用程式外掛化研究之AssertManager》中,我們實現了載入外掛apk中資源問題,實際上我們是單獨建立了用於訪問外掛資源的Ass
Android應用程式外掛化研究之Activity註冊
最近在研究Android應用的外掛化開發,看了好幾個相關的開源專案。外掛化都是在解決以下幾個問題: 如何把外掛apk中的程式碼和資源載入到當前虛擬機器。如何把外掛apk中的四大元件註冊到程序中。如何防止外掛apk中的資源和宿主apk中的資源引用衝突。在上篇文章中我研究了如何
SQL Server建立應用程式角色與標準角色
Microsoft® SQL Server™ 中的安全系統在最低級別,即資料庫本身上實現。無論使用什麼應用程式與 SQL Server 通訊,這都是控制使用者活動的最佳方法。但是,有時必須自定義安全控制以適應個別應用程式的特殊需要,尤其是當處理複雜資料庫和含有大表的資料庫時
在 SQL Server 中建立應用程式角色
應用程式角色可提供對應用程式(而不是資料庫角色或使用者)分配許可權的方法。使用者可以連線到資料庫、啟用應用程式角色以及採用授予應用程式的許可權。授予應用程式角色的許可權在連線期間有效。 安全說明 當客戶端應用程式在連線字串中提供應用程式角色名稱和密碼時,可啟用應用程式角
Gradle 1.12使用者指南翻譯——第四十五章. 應用程式外掛
本文由CSDN部落格貌似掉線翻譯,其他章節的翻譯請參見:http://blog.csdn.net/column/details/gradle-translation.html翻譯專案請關注Github上的地址:https://github.com/msdx/gradledoc
AdvancED Flex 4 (一):使用測試驅動開發模式建立應用程式
Author: Shashank Tiwari & Elad Elrom Translator: 李學錕 Chapter 1: 使用測試驅動開發模式建立應用程式..................................................
Android應用程式外掛化研究之DexClassLoader
最近在研究Android應用的外掛化開發,看了好幾個相關的開源專案。外掛化都是在解決以下幾個問題: * 如何把外掛apk中的程式碼和資源載入到當前虛擬機器。 * 如何把外掛apk中的四大元件註冊到程序中。 * 如何防止外掛apk中的資源和宿主apk中的
qt退出應用程式(exe)的方法
首先退出應用程式(exe)的方法 方法1: QApplication* app; app->exit(0); 方法2: QAppl
asp.net 2安裝遇到問題的解決(由於無法建立應用程式域,因此未能執行請求。錯誤: 0x80070005 拒絕訪問)
1:安裝2.0之後,在IIS的虛擬目錄的屬性設定中會多出一個ASP.NET標籤,在那裡邊把執行時調整為2.0,預設使用的是1.1的執行時。 2: 這個是許可權問題, 首先檢查應用程式池的屬性,看看它是以什麼使用者身份執行的,一般是NETWORK SERVICE
使用Qt編寫模組化外掛式應用程式
動態連結庫技術使軟體工程師們獸血沸騰,它使得應用系統(程式)可以以二進位制模組的形式靈活地組建起來。比起原始碼級別的模組化,二進位制級別的模組劃分使得各模組更加獨立,各模組可以分別編譯和連結,模組的升級不會引起其它模組和主程式的重新編譯,這點對於大系統的構建來說更加實用。另一
ubuntu16.04應用程式建立快捷方式或啟動器
參考:http://www.blogs.digitalworlds.net/softwarenotes/?p=54等 0 介紹 如果在Linux桌面系統中你經常使用一個程式,你可能想去建立一個“桌面快捷方式”,以便於你在桌面只要點選一下快捷方式就可以啟動它。雖然不少帶有圖形介面的程式會在安裝
Android原始碼解析之應用程式資源管理器(Asset Manager)的建立過程分析
轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個