IT教程 ·

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

One Stage目标检测

目次

  • 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插件>挑选

qt creator源码全方面剖析(2-10-2) IT教程 第1张

项目引见和位置对话框被翻开。

qt creator源码全方面剖析(2-10-2) IT教程 第2张

  1. 为您的项目定名,并指定该项目标途径。 现实插件的称号能够与项目称号差别。 稍后您将在导游中挑选该称号。 继承下一页。

    套件挑选对话框被翻开。

qt creator源码全方面剖析(2-10-2) IT教程 第3张

  1. 挑选用于构建和运转项目标套件。 关于Qt Creator插件,套件必须是桌面装备范例,而Qt版本必须是构建插件时所用的Qt Creator的Qt版本(最好是完全雷同的)。 假如您运用不兼容的Qt版原本构建插件,则Qt Creator尝试加载插件时,会涌现毛病。 继承下一页。

    插件信息对话框被翻开。

qt creator源码全方面剖析(2-10-2) IT教程 第4张

  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实例加载。继承下一页。

    项目治理对话框被翻开。

qt creator源码全方面剖析(2-10-2) IT教程 第5张

  1. 检察将要建立的文件,挑选Qt Creator项目运用的版本控制体系(这是一个好主意!),然后完成导游。

构建并运转插件

假如您在项目导游中通报了准确的Qt Creator源文件和构建途径,则在按下构建按钮时,您的插件应当能够很好地被构建。 当您尝试运转你的项目时,Qt Creator将讯问您要运转的可实行文件,并显现以下对话框:

qt creator源码全方面剖析(2-10-2) IT教程 第6张

在构建中挑选Qt Creator可实行文件的途径,途径在项目导游的Qt Creator build设置中指定,然后单击“肯定”。 Qt Creator启动,您能够考证插件是不是已胜利加载:查找菜单项Tools > Example,然后在关于插件对话框中查找插件。

qt creator源码全方面剖析(2-10-2) IT教程 第7张

文件组织

插件导游会建立一组插件须要或应当具有的基础文件。 我们将在以下各节中细致引见个中的一些内容,这是一个简短的概述:

文件 角色
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%QtProjectqtcreator" 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翻开一个音讯框,该音讯框显现内容丰富的文本和肯定按钮。

java代码之美(16) ---Java8 Optional

参与评论