Qt Creator插件

这里以Qt Creator 4.15.2版本的源码为示例进行分析

源码结构如下,为了追溯其插件加载过程,从main.cpp入手

Qt Creator的插件目录,生成的插件,好几十个呢

 Qt Creator插件的读取

int main(int argc, char **argv)中以下代码创建插件的管理

    PluginManager pluginManager;PluginManager::setPluginIID(QLatin1String("org.qt-project.Qt.QtCreatorPlugin"));PluginManager::setGlobalSettings(globalSettings);PluginManager::setSettings(settings);

 int main(int argc, char **argv)中以下设置插件的读取目录,读取所有插件信息

    const QStringList pluginPaths = getPluginPaths() + options.customPluginPaths;PluginManager::setPluginPaths(pluginPaths);//读取插件目录下的插件

从 PluginManager::setPluginPaths(pluginPaths)调用追溯到如下

void PluginManagerPrivate::setPluginPaths(const QStringList &paths)
{qCDebug(pluginLog) << "Plugin search paths:" << paths;qCDebug(pluginLog) << "Required IID:" << pluginIID;pluginPaths = paths;readSettings();readPluginPaths();
}

继续追溯void PluginManagerPrivate::readPluginPaths()

    for (const QString &pluginFile : pluginFiles(pluginPaths)) {PluginSpec *spec = PluginSpec::read(pluginFile);
PluginSpec *PluginSpec::read(const QString &filePath)
{auto spec = new PluginSpec;if (!spec->d->read(filePath)) { // not a Qt Creator plugindelete spec;return nullptr;}return spec;
}

其中bool PluginSpecPrivate::read(const QString &fileName)方法读取了插件的基本信息

Qt Creator 加载插件

从main函数中的 PluginManager::loadPlugins();开始追溯插件的加载

void PluginManagerPrivate::loadPlugins()
{//所有插件都会从loaded-->initialized-->runningconst QVector<PluginSpec *> queue = loadQueue();Utils::setMimeStartupPhase(MimeStartupPhase::PluginsLoading);for (PluginSpec *spec : queue)loadPlugin(spec, PluginSpec::Loaded);Utils::setMimeStartupPhase(MimeStartupPhase::PluginsInitializing);for (PluginSpec *spec : queue)loadPlugin(spec, PluginSpec::Initialized);Utils::setMimeStartupPhase(MimeStartupPhase::PluginsDelayedInitializing);Utils::reverseForeach(queue, [this](PluginSpec *spec) {loadPlugin(spec, PluginSpec::Running);//从这里开始加载插件...step2if (spec->state() == PluginSpec::Running) {delayedInitializeQueue.push(spec);} else {// Plugin initialization failed, so cleanup after itspec->d->kill();}});...
}

插件加载的几个主要步骤,load, initialize, run

在 void PluginManagerPrivate::loadPlugin(PluginSpec *spec, PluginSpec::State destState)中

    switch (destState) {case PluginSpec::Loaded:profilingReport(">loadLibrary", spec);spec->d->loadLibrary();profilingReport("<loadLibrary", spec);break;case PluginSpec::Initialized:profilingReport(">initializePlugin", spec);spec->d->initializePlugin();profilingReport("<initializePlugin", spec);break;case PluginSpec::Stopped:profilingReport(">stop", spec);if (spec->d->stop() == IPlugin::AsynchronousShutdown) {asynchronousPlugins << spec;connect(spec->plugin(), &IPlugin::asynchronousShutdownFinished,this, &PluginManagerPrivate::asyncShutdownFinished);}profilingReport("<stop", spec);break;default:break;}

继续追溯bool PluginSpecPrivate::loadLibrary()

    if (!loader.load()) {//这里是加载插件hasError = true;errorString = QDir::toNativeSeparators(filePath)+ QString::fromLatin1(": ") + loader.errorString();return false;}

Qt Creator插件

合格的插件需要继承自IPlugin抽象类

以CppEditorPlugin为例

class CppEditorPlugin : public ExtensionSystem::IPlugin

看一下IPlugin类


#pragma once#include "extensionsystem_global.h"#include <QObject>namespace ExtensionSystem {namespace Internal {class IPluginPrivate;class PluginSpecPrivate;
}class PluginManager;
class PluginSpec;class EXTENSIONSYSTEM_EXPORT IPlugin : public QObject
{Q_OBJECTpublic:enum ShutdownFlag {SynchronousShutdown,AsynchronousShutdown};IPlugin();~IPlugin() override;virtual bool initialize(const QStringList &arguments, QString *errorString) = 0;virtual void extensionsInitialized() {}virtual bool delayedInitialize() { return false; }virtual ShutdownFlag aboutToShutdown() { return SynchronousShutdown; }virtual QObject *remoteCommand(const QStringList & /* options */,const QString & /* workingDirectory */,const QStringList & /* arguments */) { return nullptr; }virtual QVector<QObject *> createTestObjects() const;PluginSpec *pluginSpec() const;signals:void asynchronousShutdownFinished();private:Internal::IPluginPrivate *d;friend class Internal::PluginSpecPrivate;
};} // namespace ExtensionSystem

 实现具体的插件类时,以下方法是必须重写的

virtual bool initialize(const QStringList &arguments, QString *errorString) = 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3 相对于 Vue2,模板和组件的一些变化

目录 1&#xff0c;模板的变化1&#xff0c;v-modelvue2vue3 2&#xff0c;v-if 和 v-for3&#xff0c;keyv-forv-if 4&#xff0c;Fragment 2&#xff0c;组件的变化1&#xff0c;Teleport2&#xff0c;异步组件 1&#xff0c;模板的变化 1&#xff0c;v-model vue2 对组件…

垃圾回收系统小程序定制开发搭建攻略

在这个数字化快速发展的时代&#xff0c;垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业&#xff0c;本文将分享如何使用第三方制作平台乔拓云网&#xff0c;定制开发搭建垃圾回收系统小程序。 首先&#xff0c;使用乔拓云网账号登录平…

【UE5 Cesium】actor随着视角远近来变化其本身大小

效果 步骤 1. 首先我将“DynamicPawn”设置为默认的pawn类 2. 新建一个父类为actor的蓝图&#xff0c;添加一个静态网格体组件 当事件开始运行后添加一个定时器&#xff0c;委托给一个自定义事件&#xff0c;每2s执行一次&#xff0c;该事件每2s获取一下“DynamicPawn”和acto…

html+css 通过div模拟出一个表格样式,优化多个边框导致的宽度计算问题

htmlcss 通过div模拟出一个表格样式&#xff0c;优化多个边框导致的宽度计算问题 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

VB.NET—DataGridView控件教程详解

目录 前言: 过程: 第一步: 第二步: 第三步: 第四步: 第五步&#xff1a; 番外篇: 总结: 前言: DataGridView是.NET FormK中的一个Windows窗体控件&#xff0c;它提供了一个可视化的表格控件&#xff0c;允许用户以表格形式显示和编辑数据。它通常用于显示和编辑数据库…

JavaEE-博客系统2(功能设计)

本部分内容&#xff1a;实现博客列表页&#xff1b;web程序问题的分析方法&#xff1b;实现博客详情页&#xff1b; 该部分的代码如下&#xff1a; WebServlet("/blog") public class BlogServlet extends HttpServlet {//Jackson ObjectMapper类(com.fasterxml.jac…

Pyhotn: Mac安装selenium没有chromedriver-114以上及chromedriver无法挪到/usr/bin目录下的问题

1.0 安装selenium 终端输入&#xff1a; pip install selenium 查看版本&#xff1a; pip show selenium2.0 安装chromedriver 查看chrome版本 网上大多数是&#xff0c;基本到114就停了。 https://registry.npmmirror.com/binary.html?pathchromedriver/ 各种搜索&#…

ros1 自定义订阅者Subscriber的编程实现

话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09;Subscriber&#xff0c;即海龟仿真器节点 /turtlesim Publisher(Turtle Velocity)&#xff0c;发布Messa…

Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)

一、触摸 TouchAction 在所有的 Appium 客户端库里&#xff0c;TouchAction 触摸对象被创建并被赋予一连串的事件。 规范里可用的事件有&#xff1a; * 短按(press) * 释放(release) * 移动到(moveTo) * 点击(tap) * 等待(wait) * 长按(longPress) * 取消(cancel) * 执行(per…

【教程】多进程下载百度旋转验证码图片-制作数据集

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 效果展示&#xff1a; 直接上代码&#xff0c;开箱即用&#xff08;当然selenium库自己装一下&#xff09;&#xff1a; import os import time import requests from selenium import webdriver from selenium.…

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

如何找出最优的【SVC】核函数和参数值—以乳腺癌数据集为例

在实际的工作中&#xff0c;有的时候我们不知道数据特征&#xff0c;也不知道我们的数据是线性还是非线性。因此我们需要对数据一步步进行摸索&#xff0c;来找到最优的核函数和参数值。接下来我们以sklearn乳腺癌数据集为例。 先来导入相应的模块&#xff1a; from sklearn.d…

【I/O流之旅】File类-零基础入门指南

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

第20章_Myisam与InnoDB

文章目录 区别如何选择innodb额外补充知识innodb为什么推荐使用自增ID作为主键innodb引擎4大特性 区别 InnoDB支持事务&#xff0c;MyISAM不支持&#xff0c;对于InnoDB每一条SQL语言都默认封装成事务&#xff0c;自动提交&#xff0c;这样会影响速度&#xff0c;所以最好把多条…

顶板事故防治vr实景交互体验提高操作人员安全防护技能水平

建筑业在我国各行业中属危险性较大且事故多发的行业&#xff0c;在建筑业“八大伤害”(高处坠落、坍塌、物体打击、触电、起重伤害、机械伤害、火灾爆炸及其他伤害)事故中&#xff0c;高处坠落事故的发生率最高、危险性极大。工地现场培训vr坠落体验利用虚拟现实技术还原各种情…

Day23力扣打卡

打卡记录 将 x 减到 0 的最小操作数&#xff08;逆向思维 滑动窗口&#xff09; 链接 将 x 减到 0 的最小操作数&#xff0c;可以逆向思考&#xff0c;求一个数组中的最大长度的滑动窗口&#xff0c;来使得这个窗口里的数等于 全数组之和 - x 的值。 class Solution { publ…

LLM之幻觉(一):大语言模型幻觉解决方案综述

论文题目&#xff1a;《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 ​论文链接&#xff1a;https://arxiv.org/abs/2309.06794v1 论文代码&#xff1a;https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 一、幻觉介绍 …

原语:串并转换器

串并转换器OSERDESE2 可被Select IO IP核调用。 OSERDESE2允许DDR功能 参考&#xff1a; FPGA原语学习与整理第二弹&#xff0c;OSERDESE2串并转换器 - 知乎 (zhihu.com) 正点原子。 ISERDESE2原语和OSERDESE2原语是串并转换器&#xff0c;他的的功能都是实现串行数据和并行…

0基础学习VR全景平台篇第118篇:利用动作录制器功能避免重复操作 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好。欢迎收看蛙色VR系列教程之PS利用动作记录器节约补地时间。 大家拍摄在补地的时候&#xff0c;利用插件选择输入输出选项的时候&#xff0c;每次重复操作…

基于springboot垃圾分类管理系统

基于springboot垃圾分类管理系统 摘要 垃圾分类管理系统是一个基于现代技术和数据管理方法的解决方案&#xff0c;旨在协助城市和社区更有效地管理垃圾分类。在这个系统中&#xff0c;Spring Boot框架充当了后端应用程序的构建工具&#xff0c;为其提供了高度灵活的特性。该系统…