qt creator源码全方面分析(2-10-2)

目录

  • 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的二进制和源代码兼容性规则(https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-2-1-1.html),Qt Creator插件向导创建了一个插件,该插件只能在创建时使用的Qt Creator版本中运行。

  1. 选择文件>新建文件或项目>库>Qt Creator插件>选择

项目介绍和位置对话框被打开。

  1. 为您的项目命名,并指定该项目的路径。 实际插件的名称可以与项目名称不同。 稍后您将在向导中选择该名称。 继续下一页。

    套件选择对话框被打开。

  1. 选择用于构建和运行项目的套件。 对于Qt Creator插件,套件必须是桌面设备类型,而Qt版本必须是构建插件时所用的Qt Creator的Qt版本(最好是完全相同的)。 如果您使用不兼容的Qt版本来构建插件,则Qt Creator尝试加载插件时,会出现错误。 继续下一页。

    插件信息对话框被打开。

  1. 插件名称字段中,键入Example。插件的名称将作为标识符,并且也是代码中文件名和类的基础。
  2. 以下字段的值是主要信息,并显示在Qt Creator的插件概述的详细视图中(帮助>关于插件,或者在Mac上为Qt Creator>关于插件)。
    • Vendor name是创建插件的公司或组织的简称。这也用于插件部署的路径名。
    • Copyright就一行,简短的版权字符串。
    • License是许可证文本。
    • Description是插件功能的简短描述。
    • URL是一个网站,用户可以在其中找到有关插件和/或提供插件的组织的更多信息。
  3. 设置Qt Creator源文件和Qt Creator构建字段,分别输入您要用来测试插件的Qt Creator实例的源文件和构建目录。如果您未正确执行此操作,则将导致插件编译错误,并且您的插件可能根本不会出现在Qt Creator中。
  4. 部署到列表中,选择Qt Creator构建。这将.pro文件设置为,直接部署插件到Qt Creator构建目录的插件子目录中(要求具有写权限)。另一个选项,本地用户设置,将.pro文件设置为,部署插件到Qt Creator的用户插件路径中(例如Unix系统上的~/.config/QtProject/qtcreator/plugins)。我们选择Qt Creator构建,是因为我们使用自编译Qt Creator,并且希望插件仅被该Qt Creator实例加载。继续下一页。

    项目管理对话框被打开。

  1. 查看将要创建的文件,选择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.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-2-10-2.html

时间: 2024-08-27 02:33:12

qt creator源码全方面分析(2-10-2)的相关文章

qt creator源码全方面分析(2-10-5)

目录 The Plugin Manager, the Object Pool, and Registered Objects 插件管理器 对象池和已注册对象 The Plugin Manager, the Object Pool, and Registered Objects 通常,插件不需要直接访问插件管理器. 交互主要间接的通过ExtensionSystem::IPlugin接口. 在某些情况下,则必须使用插件管理器API. 插件需要访问插件管理器的对象池,以扩展Qt Creator的某些方

qt creator源码全方面分析(2-0)

目录 Extending Qt Creator Manual 生成领域特定的代码和模板 代码片段 文件和项目模板 自定义向导 支持其他文件类型 MIME类型 高亮和缩进 自定义文本编辑器 其他自定义编辑器 运行外部工具 简单的外部工具 复杂的外部工具 所有主题 Extending Qt Creator Manual Qt Creator是为Qt开发人员的需求量身定制的跨平台集成开发环境(IDE). Qt Creator可以通过多种方式扩展. 例如,Qt Creator架构基于插件加载器,这意味着

qt creator源码全方面分析(2-10)

目录 Creating Plugins Creating Plugins Qt Creator的核心是一个插件加载程序,加载并运行一组插件,实际上是这些插件提供了您从Qt Creator IDE中了解的功能.甚至应用程序主窗口和菜单都由插件提供的.插件使用不同的方式,供其他插件访问本插件的功能,并允许它们扩展应用程序的某些方面. 例如,Core插件是Qt Creator完全运行所必须具备的非常基本的插件,它提供了主窗口,以及相关API,用于添加菜单项,模式,编辑器类型,导航面板和许多其他内容.

qt creator源码全方面分析(3-6)

目录 qtcreatorplugin.pri 使用实例 上半部 下半部 结果 qtcreatorplugin.pri 上一节我们介绍了qtcreatorlibrary.pri,现在我们介绍qtcreatorplugin.pri,其实插件的本质也是动态库,所以qtcreatorplugin.pri实现的内容和功能与qtcreatorlibrary.pri差不多. 使用实例 和上一节一样,为了分析这个文件,我们也再找个使用该pri的例子,源目录\src\plugins\cppeditor\cpped

qt creator源码全方面分析(3-8)

目录 项目文件工作流程 多层目录模式 依赖解析模式 包含,链接和输出 包含 链接 输出 构建目录架构 项目文件工作流程 我们在前面已经讨论了所有的项目文件, qtcreator.pro qtcreator.pri qtcreatordata.pri qtcreatorlibrary.pri qtcreatorplugin.pri qtcreatortool.pri 下面我们再从头到尾来捋一遍. 多层目录模式 我们可以看到,所有的*.pro文件中,除了最底层的子项目.都采用TEMPLATE和SUB

qt creator源码全方面分析(4)

前置基础介绍 在继续我们的源码学习之前,我们在这里花费一章节来学习一些基础的编码范式. 这些编码范式在后面的几乎所有的源码中都会用到.因此,在这里提前进行介绍. 一方面,有助于理解源码,另一方面,也可以用到自己的日常编码中. 原创造福大家,共享改变世界 献出一片爱心,温暖作者心灵 qt creator源码全方面分析(4) 原文地址:https://www.cnblogs.com/codeForFamily/p/qt-creator-ide-source-learn-4.html

qt creator源码全方面分析(2)

目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 配置文件 qtcreator-project.qdocconf qtcreator-developer.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过多的介绍了.我们首先来重点关注doc文件夹.对于理解源码,帮助文档总是能起到非常有效的作用.其实,我们在第一章<目录介绍>中已经对doc文件夹进行了一个大概的介绍. 帮助文档 帮助文档的来源有两个组成部分: 源代码中的注释 qdoc文件 两者都采用一定约束规范

qt creator源码全方面分析(2-3)

目录 External Tool Specification Files 文件名 位置 文件格式 主要标签 描述标签 可执行规范标签 示例 External Tool Specification Files 外部工具规范文件描述了可以从工具>外部菜单运行的工具. 它指定工具的名称,要运行的可执行文件,可选参数以及如何处理工具的输出. 文件名 <yourtoolname>.xml 位置 用户指定工具位于Mac和Linux上的$HOME/.config/QtProject/qtcreator

qt creator源码全方面分析(2-2)

目录 Common Extension Tasks Common Extension Tasks 本节总结了可用于将UI组件添加到Qt Creator的API函数. 任务 详细 API 添加菜单或菜单项 你可以扩展现有菜单或者创建一个新的菜单 Core::ActionManager, Core::Command 添加可配置的键盘快捷方式 注册快捷方式,使用户可以在通用快捷方式设置对话框中对其进行配置 Core::ActionManager, Core::Command 添加一个模式 模式对应于完