当前位置: 首页 > news >正文

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;

相关文章:

Qt Creator插件

这里以Qt Creator 4.15.2版本的源码为示例进行分析 源码结构如下&#xff0c;为了追溯其插件加载过程&#xff0c;从main.cpp入手 Qt Creator的插件目录&#xff0c;生成的插件&#xff0c;好几十个呢 Qt Creator插件的读取 int main(int argc, char **argv)中以下代码创建插…...

AI全栈大模型工程师(十九)Semantic Kernel

文章目录 Semantic KernelSK 的开发进展SK 的生态位SK 基础架构后记 Semantic Kernel 先比较下 Semantic Kernel 和 LangChain。 Semantic KernelLangChain出品公司微软LangChain AI支持语言Python、C#、Java、TypeScriptPython、TypeScript开源协议MITMIT被应用在Microsoft …...

Dubbo 的服务请求失败怎么处理?

本文引用mic老师面试文档 今天分享的面试题&#xff0c;几乎是 90%以上的互联网公司都会问到的问题。 “Dubbo 的服务请求失败怎么处理”&#xff1f; 对于这个问题&#xff0c;我们来看一下普通人和高手的回答。 普通人 嗯… 我记得&#xff0c; Dubbo 请求处理失败以后&a…...

存储虚拟化讲解

目录 存储虚拟化的分类 按照虚拟化发生的位置分类 基于主机的虚拟化 基于存储设备的虚拟化 基于网络的虚拟化 按照虚拟化实现方式分类 带内虚拟化 带外虚拟化 按照虚拟化的对象分类 虚拟机磁盘类型 按照磁盘的特性分类 按照磁盘的安全性分类 什么是虚拟化 存储虚拟…...

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…...

Apache ActiveMQ 远程代码执行漏洞影响范围

漏洞相关信息 项目内容漏洞名称Apache ActiveMQ 远程代码执行漏洞 漏洞描述 组件名称&#xff1a;Apache ActiveMQ 漏洞类型&#xff1a;远程代码执行 利用条件&#xff1a; 1、用户认证&#xff1a;不需要用户认证 2、触发方式&#xff1a;网络可访问 ActiveMQ的61616端…...

如何规划并新建大数据平台的独立生产域?5步走

一般来说&#xff0c;大数据平台包括以下4类数据生产域——生产生态环境&#xff08;正式生产环境&#xff09;、开发和测试环境、培训和演示环境、灾备环境。各生产域在由平台提供资源、安全、监控、故障恢复等保障的同时&#xff0c;不同的生产域之间还需要严格隔离&#xff…...

工程车云管家|叉车智能管家安卓主板方案

工程车云管家是一款功能强大的设备管理和调度系统&#xff0c;它可以实时追踪工程车或机械设备的地理位置、视频、行驶轨迹、油位油耗、工作时长和地点、以及运行状况等信息&#xff0c;并将这些数据通过云平台存储、分析&#xff0c;并发送到管理者的手机上。这使得管理者能够…...

大数据学习之Spark性能优化

文章目录 Spark三种任务提交模式宽依赖和窄依赖StageSpark Job的三种提交模式 Shuffle机制分析未优化的Hash Based Shuffle优化后的Hash Based ShuffleSort-Based Shuffle Spark之checkpointcheckpoint概述checkpoint与持久化的区别checkPoint的使用checkpoint源码分析 Spark程…...

个人服务器到期,项目下线,新的开始

告别旧服务器 2023.11.06服务器到期&#xff0c;所有项目正式下线 时间真的过的很快&#xff0c;从开始踏入编程的大门&#xff0c;到现在不知不觉已经陆续经手了两台服务器了&#xff0c;目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿&#xff0c;该服务器上目前运行的项…...

arcgis 网络分析 生成可达范围/等时线

需求&#xff1a;生成从地铁站步行10分钟可达的范围面图层。 线图层预处理 在精度要求不是很高的情况下&#xff0c;可采用OSM路网&#xff0c;从中剔除不允许步行的道路类型&#xff1a;高速公路、快速路。 在路网图层中新增一个字段“步行时间”&#xff0c;用字段计算器&…...

npm切换镜像源

一&#xff0c;切换 npm 镜像源 npm 存储包文件的服务器在国外&#xff0c;速度很慢&#xff0c;所以我们需要解决这个问题。 国内淘宝的开发团队把 npm 在国内做了一个备份&#xff0c;网址是&#xff1a;http://npm.taobao.org/。 # 查看当前的源 npm config ls # 在上面命令…...

Python简单学习

Python List # python 列表可以加入所有类型 如列表&#xff0c;字典&#xff0c;数字&#xff0c;字符串等bicycles [trek, cannondale, redline, specialized] print(bicycles)# 访问列表元素&#xff0c;使用索引 print(bicycles[0])# 访问最后一个元素下标-1. 以此类推 p…...

2000-2021年全国各省资本存量测算数据(含原始数据+测算过程+计算结果)

2000-2021年全国各省资本存量测算数据&#xff08;含原始数据测算过程计算结果&#xff09; 1、时间&#xff1a;2000-2021年&#xff08;以2000年为基期&#xff09; 2、范围&#xff1a;30个省市&#xff08;不含西藏&#xff09; 3、指标&#xff1a;固定资产形成总额、固…...

Vue.js 中的异步组件是什么?

在 Vue.js 中&#xff0c;异步组件是一种延迟加载组件的方式。允许将组件的加载推迟到组件真正需要被渲染时再进行&#xff0c;而不是在初始化时立即加载所有组件。 通过使用异步组件&#xff0c;可以提高应用的初始加载速度&#xff0c;尤其是当应用包含大量组件时。只有当组…...

Luckysheet 实现excel多人在线协同编辑

前言 前些天看到Luckysheet支持协同编辑Excel&#xff0c;正符合我们协同项目的一部分&#xff0c;故而想进一步完善协同文章&#xff0c;但是遇到了一下困难&#xff0c;特此做声明哈&#xff0c;若侵权&#xff0c;请联系我删除文章&#xff01; 若侵犯版权、个人隐私&#x…...

C++线程库的基本使用(初级)

#include<iostream> #include<thread> #include<string> void printHelloWorld(std::string msg) {std::cout << msg<< std::endl;return; } int main() {std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名&…...

2023最新版JavaSE教程——第1天:Java语言概述

目录 一、抽丝剥茧话Java1.1 当前大学生就业形势1.2 IT互联网是否依旧靠谱1.3 IT行业岗位分析1.4 软件开发之Java开发1.5 到底多少人在用Java 二、计算机的硬件与软件2.1 计算机组成&#xff1a;硬件软件2.2 CPU、内存与硬盘2.3 输入设备&#xff1a;键盘输入 三、软件相关介绍…...

PTL货位指引标签为仓储管理打开新思路

PTL货位指引标签是一种新型的仓储管理技术&#xff0c;它通过LED灯光指引和数字显示&#xff0c;为仓库管理带来了全新的管理思路和效率提升&#xff0c;成为现代物流仓库管理中的重要工具。 首先&#xff0c;PTL货位指引标签为仓储管理业务带来了管理新思路。传统的仓库管理中…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念

一.Maven的POM POM全称&#xff1a;Project Object Model【项目对象模型】&#xff0c;将项目封装为对象模型&#xff0c;便于使用Maven管理【构建】项目 pom.xml常用标签 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...