1. 程式人生 > >Qt 建立應用程式外掛

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應用程式在執行的過程中,是通過一個