qt插件元数据不包含一个有效的元数据_qt creator源码全方面分析(2-10-2)
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
## /plugins/
## where 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
###### _dependencies.pri, where 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實例已被創建。
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打開一個消息框,該消息框顯示內容豐富的文本和確定按鈕。
原創造福大家,共享改變世界
獻出一片愛心,溫暖作者心靈
總結
以上是生活随笔為你收集整理的qt插件元数据不包含一个有效的元数据_qt creator源码全方面分析(2-10-2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (旧)子数涵数·C语言——条件语句
- 下一篇: 笔记本超频会烧吗_如何判断电脑是否支持D