目錄
- Creating Your First Plugin
- 創建一個插件專案
- 構建并運行插件
- 檔案結構
- qmake專案
- 插件元資料模板
- 插件類
- 頭檔案
- 源檔案
Creating Your First Plugin
本節介紹,如何使用Qt Creator提供的插件模板,來創建Qt Creator插件,并獲取對插件的組成和結構的第一印象,
創建一個插件專案
Qt Creator附帶了一個創建Qt Creator插件的向導,該向導會為您創建一個可運行的最小插件,我們強烈建議您使用兩個不同的Qt Creator實體來開發和測驗您的插件,否則,您的插件也可以被加載到您的開發環境中,但如果你的插件不穩定,這會使開發環境也不穩定, 您可以僅僅創建Qt Creator的一個拷貝,使用一個進行實際開發,而使用另一個來測驗插件,
您需要確保,你使用的用來創建插件的Qt Creator的版本要相同, 由于Qt Creator的[二進制和源代碼兼容性規則](file:///F:/plugin/qt_creator/qt-creator-opensource-src-4.6.2/doc/api/zx-html-doc-dev/coding-style.html#binary-and-source-compatibility)(https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-2-1-1.html),Qt Creator插件向導創建了一個插件,該插件只能在創建時使用的Qt Creator版本中運行,
- 選擇檔案>新建檔案或專案>庫>Qt Creator插件>選擇

專案介紹和位置對話框被打開,

-
為您的專案命名,并指定該專案的路徑, 實際插件的名稱可以與專案名稱不同, 稍后您將在向導中選擇該名稱, 繼續下一頁,
套件選擇對話框被打開,

-
選擇用于構建和運行專案的套件, 對于Qt Creator插件,套件必須是桌面設備型別,而Qt版本必須是構建插件時所用的Qt Creator的Qt版本(最好是完全相同的), 如果您使用不兼容的Qt版本來構建插件,則Qt Creator嘗試加載插件時,會出現錯誤, 繼續下一頁,
插件資訊對話框被打開,

-
在插件名稱欄位中,鍵入Example,插件的名稱將作為識別符號,并且也是代碼中檔案名和類的基礎,
-
以下欄位的值是主要資訊,并顯示在Qt Creator的插件概述的詳細視圖中(幫助>關于插件,或者在Mac上為Qt Creator>關于插件),
-
Vendor name是創建插件的公司或組織的簡稱,這也用于插件部署的路徑名,
-
Copyright就一行,簡短的著作權字串,
-
License是許可證文本,
-
Description是插件功能的簡短描述,
-
URL是一個網站,用戶可以在其中找到有關插件和/或提供插件的組織的更多資訊,
-
-
設定Qt Creator源檔案和Qt Creator構建欄位,分別輸入您要用來測驗插件的Qt Creator實體的源檔案和構建目錄,如果您未正確執行此操作,則將導致插件編譯錯誤,并且您的插件可能根本不會出現在Qt Creator中,
-
在部署到串列中,選擇Qt Creator構建,這將.pro檔案設定為,直接部署插件到Qt Creator構建目錄的插件子目錄中(要求具有寫權限),另一個選項,本地用戶設定,將.pro檔案設定為,部署插件到Qt Creator的用戶插件路徑中(例如Unix系統上的
~/.config/QtProject/qtcreator/plugins),我們選擇Qt Creator構建,是因為我們使用自編譯Qt Creator,并且希望插件僅被該Qt Creator實體加載,繼續下一頁,專案管理對話框被打開,

- 查看將要創建的檔案,選擇Qt Creator專案使用的版本控制系統(這是一個好主意!),然后完成向導,
構建并運行插件
如果您在專案向導中傳遞了正確的Qt Creator源檔案和構建路徑,則在按下構建按鈕時,您的插件應該可以很好地被構建, 當您嘗試運行你的專案時,Qt Creator將詢問您要運行的可執行檔案,并顯示以下對話框:

在構建中選擇Qt Creator可執行檔案的路徑,路徑在專案向導的Qt Creator build設定中指定,然后單擊“確定”, Qt Creator啟動,您可以驗證插件是否已成功加載:查找選單項Tools > Example,然后在關于插件對話框中查找插件,

檔案結構
插件向導會創建一組插件需要或應該具備的基礎檔案, 我們將在以下各節中詳細介紹其中的一些內容,這是一個簡短的概述:
| 檔案 | 角色 |
|---|---|
| Example.json.in | 插件元資料模板,QMake根據此檔案創建Example.json,該檔案作為元資料編譯到插件中, Qt Creator讀取元資料以了解有關插件的資訊, |
| example.pro | 專案檔案,QMake使用該檔案生成Makefile,然后用于插件構建, |
| example_global.h | 包含宏定義,此插件將符號匯出給其他插件時,非常有用, |
| exampleconstants.h | 頭檔案,定義了插件代碼使用的常量, |
| exampleplugin.h/.cpp | C++頭檔案和源檔案,定義將由Qt Creator插件管理器實體化并運行的插件類, |
qmake專案
qmake專案檔案example.pro定義了如何編譯插件, 除了告訴qmake需要編譯哪些檔案之外(或由moc或uic處理),Qt Creator插件還需要進行特定設定, 讓我們詳細了解一下專案向導為您生成的內容,
DEFINES += EXAMPLE_LIBRARY
.pro檔案的第一部分允許編譯器傳遞Example_LIBRARY定義給已編譯的代碼,該定義已在example_global.h頭檔案中使用,但目前尚無真正意義, 您無需更改.pro檔案的該部分,
SOURCES += exampleplugin.cpp
HEADERS += exampleplugin.h \
example_global.h \
exampleconstants.h
此部分告訴qmake需要進行編譯或其他處理的專案檔案,您可以使用你要添加到專案中的任何檔案,來擴展該部分,
## set the QTC_SOURCE environment variable to override the setting here
QTCREATOR_SOURCES = $$(QTC_SOURCE)
isEmpty(QTCREATOR_SOURCES):QTCREATOR_SOURCES=/Users/example/qtcreator-src
## set the QTC_BUILD environment variable to override the setting here
IDE_BUILD_TREE = $$(QTC_BUILD)
isEmpty(IDE_BUILD_TREE):IDE_BUILD_TREE=/Users/example/qtcreator-build
要編譯和部署您的插件,該專案需要訪問Qt Creator源代碼,然后進行構建, 此部分包含尋找有關源代碼位置資訊的邏輯,并在QTC_SOURCE和QTC_BUILD環境變數中進行構建, 如果它們未定義,它將使用您在專案向導中設定的默認值,
因此,如果其他人在他們的計算機上打開您的插件專案,他們不需要編輯.pro檔案,而是應該為插件的構建環境設定正確的QTC_SOURCE和QTC_BUILD環境變數,
您可能不需要更改此部分,除非可以更改默認值
## uncomment to build plugin into user config directory
## <localappdata>/plugins/<ideversion>
## where <localappdata> is e.g.
## "%LOCALAPPDATA%\QtProject\qtcreator" on Windows Vista and later
## "$XDG_DATA_HOME/data/QtProject/qtcreator" or "~/.local/share/data/QtProject/qtcreator" on Linux
## "~/Library/Application Support/QtProject/Qt Creator" on Mac
# USE_USER_DESTDIR = yes
Qt Creator插件既可以安裝到Qt Creator安裝路徑中的插件子目錄(需要寫訪問權限),也可以安裝到用戶特定的插件目錄, .pro檔案中的USE_USER_DESTDIR開關定義了用于構建插件的方法(該方法與后面用于將插件分發給其他用戶的方法無關),
###### If the plugin can be depended upon by other plugins, this code needs to be outsourced to
###### <dirname>_dependencies.pri, where <dirname> is the name of the directory containing the
###### plugin's sources.
QTC_PLUGIN_NAME = Example
QTC_LIB_DEPENDS += \
# nothing here at this time
QTC_PLUGIN_DEPENDS += \
coreplugin
QTC_PLUGIN_RECOMMENDS += \
# optional plugin dependencies. nothing here at this time
###### End _dependencies.pri contents ######
此部分定義插件的名稱和依賴項, QTC_PLUGIN_NAME變數定義了插件的名稱,以及為其創建的動態庫的名稱, QTC_LIB_DEPENDS變數是您的插件所依賴的Qt Creator實用工具庫的串列, 典型的值是aggregation,extensionsystem和utils, QTC_PLUGIN_DEPENDS變數定義您的插件所依賴的Qt Creator插件, 幾乎所有Qt Creator插件都依賴coreplugin,QTC_PLUGIN_RECOMMENDS變數定義了您的插件可以選擇性依賴的Qt Creator插件, 有關更多資訊,請參見Optional Dependencies,
include($$QTCREATOR_SOURCES/src/qtcreatorplugin.pri)
包含的qtcreatorplugin.pri檔案,通過使用上面提供的資訊,確保您構建適合在Qt Creator中使用的插件,
有關qmake和一般撰寫.pro檔案的更多資訊,請參見qmake手冊,
插件元資料模板
.json檔案是一個JSON檔案,包含插件管理器查找您的插件的資訊,以及在加載插件庫檔案之前決議依賴項所需的資訊, 在這里,我們將僅作簡短介紹, 有關更多資訊,請參見Plugin Meta Data,
向導實際上并不直接創建.json檔案,而是創建一個.json.in檔案, qmake使用它來生成實際的插件.json元資料檔案,用其實際值替換QTCREATOR_VERSION之類的變數, 因此,您需要對.json.in檔案中的所有反斜杠和引號進行轉義(即,您需要寫入\和\",用來在生成的插件JSON元資料中得到反斜杠和引號),
\"Name\" : \"Example\",
\"Version\" : \"0.0.1\",
\"CompatVersion\" : \"0.0.1\",
元資料中的第一項由專案向導中定義的插件的名稱生成,第二項是插件版本,第三項是當前版本能二進制兼容的此插件的版本,
\"Vendor\" : \"My Company\",
\"Copyright\" : \"(C) My Company\",
\"License\" : \"BSD\",
\"Category\" : \"Examples\",
\"Description\" : \"Minimal plugin example.\",
\"Url\" : \"http://www.mycompany.com\",
之后,您將找到在專案向導中提供的有關插件的資訊,
$$dependencyList
$$dependencyList變數會被插件.pro檔案中的QTC_PLUGIN_DEPENDS和QTC_PLUGIN_RECOMMENDS中的依賴項資訊自動替換,
插件類
檔案exampleplugin.h和exampleplugin.cpp定義了您的小插件的實作, 我們將在這里介紹一些重點,并為各個部分提供更詳細的資訊的鏈接,
頭檔案
頭檔案exampleplugin.h定義了插件類的介面,
namespace Example {
namespace Internal {
該插件定義在Example::Internal名稱空間,該名稱空間符合Qt Creator源代碼中 namespacing的編碼規則,
class ExamplePlugin : public ExtensionSystem::IPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "Example.json")
所有Qt Creator插件都必須從ExtensionSystem::IPlugin派生,并且是QObjects派生類, Q_PLUGIN_METADATA宏對于創建有效的Qt插件是必需的, 宏中給定的IID必須是org.qt-project.Qt.QtCreatorPlugin,用于標識插件為Qt Creator插件,并且FILE必須指向該插件的元資料檔案,描述見Plugin Meta Data,
bool initialize(const QStringList &arguments, QString *errorString);
void extensionsInitialized();
ShutdownFlag aboutToShutdown();
基類定義了在插件生命周期中呼叫的基本函式,在此處需要新插件實作,Plugin Life Cycle詳細描述了這些函式及其作用,
private:
void triggerAction();
該插件有一個附加的自定義槽,用于彈出對話框,在用戶選擇該插件添加的選單項時,
源檔案
源檔案包含插件的實際實作,注冊了一個新選單和子選單項,并在觸發子選單項時,打開一個訊息框,
來自插件代碼本身,Core插件和Qt的所有必需的頭檔案都包含在檔案的開頭, 選單和子選單項在插件的initialize初始化函式中完成設定的,該函式在插件建構式完成之后的最先被呼叫,在該函式中,插件可以確保其依賴的插件的基本設定已完成,例如,Core插件的ActionManager實體已被創建,
有關插件介面實作的更多資訊,請參見ExtensionSystem::IPlugin API檔案和Plugin Life Cycle,
QAction *action = new QAction(tr("Example Action"), this);
Core::Command *cmd = Core::ActionManager::registerAction(action, Constants::ACTION_ID,
Core::Context(Core::Constants::C_GLOBAL));
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Alt+Meta+A")));
connect(action, &QAction::triggered, this, &ExamplePlugin::triggerAction);
這部分代碼創建一個新的QAction,將其注冊為動作管理器中的新Command,并將其連接到插件的槽, 動作管理器提供了一個中心位置,用戶可以在該位置分配和更改鍵盤快捷鍵,并進行管理,例如選單項應在不同情況下指向不同的插件,以及其他一些情況,
Core::ActionContainer *menu = Core::ActionManager::createMenu(Constants::MENU_ID);
menu->menu()->setTitle(tr("Example"));
menu->addAction(cmd);
Core::ActionManager::actionContainer(Core::Constants::M_TOOLS)->addMenu(menu);
在這里,將創建一個新選單,并添加已創建的命令,然后將選單添加到選單欄中的工具選單中,
void ExamplePlugin::triggerAction()
{
QMessageBox::information(Core::ICore::mainWindow(),
tr("Action Triggered"),
tr("This is an action from Example."));
}
這部分定義了觸發子選單項時呼叫的代碼,它使用Qt API打開一個訊息框,該訊息框顯示內容豐富的文本和確定按鈕,
原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14269.html
標籤:其他
