当前位置: 首页 > 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…...

Unity的粒子总是丢材质

1&#xff09;Unity的粒子总是丢材质 2&#xff09;C#传给C的Byte数组如何释放 3&#xff09;CommandBuffer.DrawProcedural在手机上为什么不生效 4&#xff09;游戏加载场景碰撞&#xff0c;会弹出显卡报错&#xff0c;驱动程序超时 这是第359篇UWA技术知识分享的推送&#xf…...

P5906 【模板】回滚莫队不删除莫队

这一题&#xff0c;虽说在洛谷标的是模板题&#xff0c;但可能没有“历史研究”那一题更加模板。 这一题相对于回滚莫队的模板题&#xff0c;可能在回滚的处理上稍微复杂了一点。对于回滚莫队就不多解释了&#xff0c;可以看一下 回滚莫队模板题 这一篇博客&#xff0c;稍微简单…...

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是&#xff1a; 1&#xff09;List 表示有序可重复列表&#xff0c;重要的实现类有&#xff1a;ArrayList, LinkedList ArrayList特点&#xff1a;底层数组实现&#xff0c;随机查找快&#xff0c;增删…...

rabbitmq 交换机相关实例代码

1.扇形交换机 定义扇形交换机和队列 package com.macro.mall.portal.config;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.…...

第四章IDEA操作Maven

文章目录 创建父工程开启自动导入配置Maven信息创建Java模块工程创建 Web 模块工程 在IDEA中执行Maven命令直接执行手动输入 在IDEA中查看某个模块的依赖信息工程导入来自版本控制系统来自工程目录 模块导入情景重现导入 Java 类型模块 导入 Web 类型模块 创建父工程 开启自动导…...

Go语言函数签名和匿名函数

函数签名 函数类型又叫做函数签名&#xff0c;一个函数的类型就是函数定义首行去掉函数名、参数名和{}&#xff0c;可以用fmt.Printf的“%T”格式化参数打印函数的类型。 两个函数类型相同的条件是&#xff1a;拥有相同的形参列表和返回值列表&#xff0c;形参名可以不同。 ty…...

Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用

前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一半&#…...

基于JavaWeb的网上销售系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

wpf添加Halcon的窗口控件报错:下列控件已成功添加到工具箱中,但未在活动设计器中启用

报错截图如下&#xff1a; 注意一下新建工程的时候选择wpf应用而不是wpf应用程序。 添加成功的控件&#xff1a;...

antv/x6 自定义html节点并且支持动态更新节点内容

antv/x6 自定义html节点 效果图定义一个连接桩公共方法注册图形节点创建html节点动态更新节点内容 效果图 定义一个连接桩公共方法 const ports {groups: {top: {position: top,attrs: {circle: {r: 4,magnet: true,stroke: #cf1322,strokeWidth: 1,fill: #fff,style: {visib…...