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

QT5建立應用程式外掛

主機環境:Windows XP

QT版本:QT5.3.2

本文主要是根據Qt Creator快速入門中9.3.2建立應用程式外掛一節,文中是基於Qt4來編寫的,我這裡是用Qt5,有一點點區別,在此記錄下,以便查詢。

建立應用程式通過外掛擴充套件一般分為以下幾步:

1. 定義介面類,提供功能函式(純虛擬函式)

2. 使用Q_DECLARE_INTERFACE()巨集來宣告該介面

3. 在應用程式中使用QPluginLoader來載入外掛

4. 使用qobject_cast()來測試外掛是否實現了給定的介面

建立外掛一般分為以下幾步:

1. 定義外掛類繼承QOBJECT類和所需介面類

2. 使用Q_INTERFACES()巨集來告訴meta-object system有關該介面

3. 使用Q_PLUGIN_METADATA()巨集來匯出該外掛

4. 構建該外掛

首先先建立外掛工程,新建一個共享庫工程,工程名稱為plugin,類名為RegExpPlugin,如下




接著增加一個C++標頭檔案宣告介面,程式碼如下

#ifndef REGEXPINTERFACE_H
#define REGEXPINTERFACE_H

#include <QString>

#define RegExpInterface_iid "anobodykey.RegExpInterface/1.0"
//宣告純虛擬函式的一般形式是 virtual 函式型別 函式名 (引數表列) =0;
class RegExpInterface
{
public:
    virtual ~RegExpInterface(){}
    virtual QString regexp(const QString &message)=0;
};
Q_DECLARE_INTERFACE(RegExpInterface, RegExpInterface_iid)
#endif // REGEXPINTERFACE_H

外掛標頭檔案以及原始碼如下

標頭檔案:

#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H

#include "plugin_global.h"
#include <QObject>
#include "regexpinterface.h"

class PLUGINSHARED_EXPORT RegExpPlugin :public QObject,RegExpInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "anobodykey.RegExpInterface/1.0" FILE "regexpplugin.json")
    Q_INTERFACES(RegExpInterface)
public:
    RegExpPlugin();
    QString regexp(const QString &message);
};

#endif // REGEXPPLUGIN_H

原始碼檔案:
#include "regexpplugin.h"
#include <QRegExp>
#include <QtPlugin>

RegExpPlugin::RegExpPlugin()
{
}
QString RegExpPlugin::regexp(const QString &message)
{
    QRegExp rx("\\d+");
    rx.indexIn(message);
    QString str = rx.cap(0);
    return str;
}

修改pro檔案修改TARGET為regexpplugin,不修改也行,但為了與原文一直,SO。。。如下
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-24T17:19:41
#
#-------------------------------------------------

QT       -= gui

TARGET = regexpplugin
TEMPLATE = lib

DEFINES += PLUGIN_LIBRARY

SOURCES += regexpplugin.cpp

HEADERS += regexpplugin.h\
        plugin_global.h \
    regexpinterface.h

unix {
    target.path = /usr/lib
    INSTALLS += target
}

最後在plugin目下下建立regexpplugin.json檔案,內容如下:
{"keys":["regexpplugin"]}

構建該工程生成regexpplugin.dll檔案,如下


下面建立應用工程,新建一個Qt Widgets Application,名稱為window,基類為MainWindow,預設即可。


為了方便把前面的regexpinterface.h介面標頭檔案拷貝到window目下,修改mainwindow.h檔案如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "regexpinterface.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    RegExpInterface *regExpInterface;
    bool loadPlugin();
};

#endif // MAINWINDOW_H

mainwindow.cpp檔案如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPluginLoader>
#include <QMessageBox>
#include <QDir>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    if(!loadPlugin())
    {
        //如果無法載入外掛
        QMessageBox::information(this,"Error","Could not load the plugin");
        ui->lineEdit->setEnabled(false);
        ui->pushButton->setEnabled(false);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}
bool MainWindow::loadPlugin()
{
    QDir pluginsDir("./");

    //遍歷外掛目錄
    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
        qDebug()<<fileName;
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();
        if(plugin)
        {
            qDebug()<<"instance plugin";
            regExpInterface = qobject_cast<RegExpInterface*>(plugin);
            if(regExpInterface)
            {
                qDebug()<<"fint the plugin";
                return true;
            }
        }
        qDebug()<<"isn't the plugin";
    }
    return false;
}

void MainWindow::on_pushButton_clicked()
{
    QString str = regExpInterface->regexp(ui->lineEdit->text());
    ui->labNum->setText(str);
}

ui介面參考文中ui即可,如下


構建該工程,並把前面的熱個小屁plugin.dll檔案拷貝到release路徑下,執行應用程式。結果如下


執行正常。

PS:兩個工程都是構建的release版本

參考文獻:Qt Creator 快速入門

相關推薦

QT5建立應用程式外掛

主機環境:Windows XP QT版本:QT5.3.2 本文主要是根據Qt Creator快速入門中9.3.2建立應用程式外掛一節,文中是基於Qt4來編寫的,我這裡是用Qt5,有一點點區別,在此記錄下,以便查詢。 建立應用程式通過外掛擴充套件一般分為以下幾步: 1. 定義

Qt 建立應用程式外掛

前言 本文Qt中建立應用程式的外掛主要有兩方面: 一、建立外掛 二、在應用程式中使用外掛 一、建立外掛 先用文字描述一下建立外掛的主要步驟 ①、首先新建一個外掛的介面類,這個類只包含純虛擬函式,這個純虛擬函式是用於給介面類實現具體功能的。並在介面

建立應用程式設定

如何:建立應用程式設定 7‎年‎03‎月‎30‎日 轉(Microsoft):https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/advanced/how-to-create-application-settings

*Qt5 設定應用程式圖示以及Debug Error 1問題**

Qt5 設定應用程式圖示以及Debug Error 1問題 第一步:下載圖示檔案(必須是.ico檔案)並放在工程原始碼資料夾下,推薦下載地址:http://www.icosky.com/ 第二步:在.pro工程建立一個.txt檔案,裡面內容為:IDI_ICON

Qt5設定應用程式圖示報錯Debug Error 1

給一個exe檔案新增一個圖示: 1、下載圖示(.ico格式),命名為:Appico.ico 2、在源目錄(與那些.cpp檔案目錄)下新建.txt檔案,內容為:IDI_ICON1 ICON DISCARDABLE “Appico.ico” (這裡需要與圖示名相同

Django入門------------------------------------------建立應用程式

在安裝好Django框架的前提下,建立應用程式,一個Django專案是由一系列的應用程式組成的。 在終端窗口裡執行的runserver,再開啟一個終端視窗,切換到manage.py所在的目錄,啟用該虛擬環境,執行starapp APPname ,這個讓Django建立應用程式的所需的基礎設施。

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中的

asp.net 2安裝遇到問題的解決(由於無法建立應用程式域,因此未能執行請求。錯誤: 0x80070005 拒絕訪問)

 1:安裝2.0之後,在IIS的虛擬目錄的屬性設定中會多出一個ASP.NET標籤,在那裡邊把執行時調整為2.0,預設使用的是1.1的執行時。   2: 這個是許可權問題, 首先檢查應用程式池的屬性,看看它是以什麼使用者身份執行的,一般是NETWORK SERVICE   

VS2012下建立QT5應用程式

本文主要熟悉一下訊號/槽如何在QT設計師中使用。本例是QT官方文件的一個例子。為了明白建立的全過程我們從建立QT專案開始寫,新手看的,大神們直接跳過。自動生成了如下的一些檔案如圖:第一個為QT設計師可以開啟的檔案;第二個其實.UI對應的程式碼下面一個生成的.h 和.cpp檔案

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

【webpack外掛使用】在開發中快速掌握並使用Webpack構建web應用程式

1.webpack-dev-server外掛的基本使用 入門程式 const path = require('path'); // 匯出一個Webpack的配置物件(通過node中的模組操作,向外暴露了一個配置物件) module.exports = { // 需要在這裡手動指定入口