Qt Creator添加自定义向导

news2024/11/16 12:57:52

文章目录

  • 一、前言
  • 二、前置说明
  • 三、wizard.json解析
    • 3.1、宏观结构
    • 3.2、微观解释
      • 3.2.1、向导信息
      • 3.2.2、定义变量
      • 3.2.3、页面定义
      • 3.2.4、文件生成
  • 四、实战

一、前言

在Qt Creator中,当我们选择新建时,Qt自带了很多选项;

在这里插入图片描述

如果我们在开发过程中,需要频繁的创建某一固定格式的工程,我们每次都要新建各种各样的文件,特别繁琐;

能不能像Qt新建工程那样,进行一些简单的配置,然后自动生成一个我们需要格式的工程呢?

当然是可以的,我们可以添加自定义向导,例如:

在这里插入图片描述


二、前置说明

自定义向导最主要的是一个wizard.json文件,例如我们需要创建一个CTK Plugin向导,就需要创建一个ctkplugin文件夹,其中包含wizard.json文件

向导文件夹存放路径:C:\Qt\Qt5.12.9\Tools\QtCreator\share\qtcreator\templates\wizards\projects

在这里插入图片描述


三、wizard.json解析

注意:如果设置名称以tr前缀开头,则该值对用户可见,应该进行翻译;

如果这个新的向导包含在 Qt Creator 源代码中,这些可翻译的字符串会出现在 Qt Creator 翻译文件中并能作为 Qt Creator 的一部分被翻译。另一种方式是,你可以把翻译以下面的语法写在 .json 文件中:

"trDisplayName": { "C": "default", "en_US": "english", "de_DE": "deutsch" }

举例:

"trDisplayName": { "C": "Project Location", "en_US": "Project Location", "de_DE": "Projekt Verzeichnis" }

3.1、宏观结构

wizard.json通常包含四部分,分别是:【向导信息】、【定义变量-options键】、【页面定义-pages键】、【文件生成-generators键】

{
	//向导信息
	//------------------------------------------------------------------------------------------
	"version": 1,
	"supportedProjectTypes": [ "CMakeProjectManager.CMakeProject", "Qbs.QbsProject", "Qt4ProjectManager.Qt4Project" ],
	"id": "R.CTK Plugin",
	"category": "G.Library",
	"trDescription": "Creates a ctk plugin for ctk plugin framework.",
	"trDisplayName": "CTK Plugin",
	"trDisplayCategory": "Library",
	"icon": "lib.png",
	"enabled": "%{JS: [ %{Plugins} ].indexOf('CppEditor') >= 0 && ([ %{Plugins} ].indexOf('QmakeProjectManager') >= 0 || [ %{Plugins} ].indexOf('QbsProjectManager') >= 0 || [ %{Plugins} ].indexOf('CMakeProjectManager') >= 0)}",

	//定义变量
	//------------------------------------------------------------------------------------------
	"options":
	[
		{ "key": "ProjectFile", "value": "%{ProFile}" },
	
		......
	],

	//页面定义
	//------------------------------------------------------------------------------------------
	"pages":
	[
		{
    		"trDisplayName": "Project Location",
        	"trShortTitle": "Location",
        	"typeId": "Project"
    	},

		......
	],

	//文件生成
	//------------------------------------------------------------------------------------------
	"generators":
	[
		{
    		"typeId": "File",
        	"data":
        	[
        		{
            		"source": "File.pro",
                	"target": "%{ProFile}",
                	"openAsProject": true
            	},
				{
                 	"source": "ImplFile.h",
                 	"target": "%{ImplHdrPath}",
                 	"openInEditor": true,
                 	"options": [
                 		{ "key": "Cpp:License:FileName", "value": "%{ImplHdrFileName}" },
                    	{ "key": "Cpp:License:ClassName", "value": "%{ImplCN}" }
                 	]
            	},

				......
        	]
		}
	]
}

3.2、微观解释

3.2.1、向导信息

{
	//向导信息
	//------------------------------------------------------------------------------------------
	"version": 1,
    "supportedProjectTypes": [ "CMakeProjectManager.CMakeProject", "Qbs.QbsProject", "Qt4ProjectManager.Qt4Project" ],
    "id": "R.CTK Plugin",
    "category": "G.Library",
    "trDescription": "Creates a ctk plugin for ctk plugin framework.",
    "trDisplayName": "CTK Plugin",
    "trDisplayCategory": "Library",
    "icon": "lib.png",
    "enabled": "%{JS: [ %{Plugins} ].indexOf('CppEditor') >= 0 && ([ %{Plugins} ].indexOf('QmakeProjectManager') >= 0 || [ %{Plugins} ].indexOf('QbsProjectManager') >= 0 || [ %{Plugins} ].indexOf('CMakeProjectManager') >= 0)}",

	......
}

在这里插入图片描述

  • id:是你的向导的唯一识别符;向导们在 category 中根据 id 的字母序排列。你可以用一个前导字母来指定向导所在的位置。你必须始终更改这个值。例如:R.CTK Plugin。该信息在向导中可以通过 %\{id\} 获得。
  • category:是将向导存放在列表中的类别;可以使用前导字母来指定在 New File or Project 对话框中类别在列表中的位置,该信息在向导中可以通过 %\{category\} 获得。

3.2.2、定义变量

  • 在字符串、JSON配置文件、模板源文件中,通过语法【%{<变量名>}】来使用定义的变量;
  • 有一类特殊的变量:%{JS:<JavaScript 表达式>},它会对给出的 JavaScript 表达式求值并将结果转化为字符串;
  • 在 JavaScript 表达式中你可以使用向导中通过 value('<variableName>') 形式定义的变量。返回的 JavaScript 对象的类型为该变量的值的类型,可以是字符串、列表、字典或布尔值。
  • 例如:%{JS: Util.fileName('%{ProjectDirectory}/%{ProjectName}', 'pro')}中的JS表达式:
  • Util.fileName('%{ProjectDirectory}/%{ProjectName}', 'pro')使用了定义的变量ProjectDirectory和变量ProjectName,通过JS表达式生成了pro文件路径字符串
{
	......
	

	//定义变量
	//------------------------------------------------------------------------------------------
	"options":
    [
        { "key": "ProjectFile", "value": "%{ProFile}" },
        { "key": "ProFile", "value": "%{JS: Util.fileName('%{ProjectDirectory}/%{ProjectName}', 'pro')}" },
    ],


	......
}

3.2.3、页面定义

在这里插入图片描述

依次对应上面的4个条目

{
	......
	
	//页面定义
	//------------------------------------------------------------------------------------------
	"pages":
    [
        {
            "trDisplayName": "Project Location",
            "trShortTitle": "Location",
            "typeId": "Project"
        },
		{
			"trDisplayName": "Kit Selection",
			"trShortTitle": "Kits",
			"typeId": "Kits",
			"enabled": "%{IsTopLevelProject}",
			"data": { "projectFilePath": "%{ProFile}" }
		},
		{
			"trDisplayName": "Plugin Information",
			"trShortTitle": "Information",
			"typeId": "Fields",
			"data" :
			[
				{
					"name": "ServiceName",
					"trDisplayName": "Service name:",
					"mandatory": false,
					"type": "LineEdit",
					"data": { "validator": "(?:(?:[a-zA-Z][a-zA-Z0-9]*::)*[a-zA-Z][a-zA-Z0-9]*|)" }
				},
				{
					"name": "PluginName",
					"trDisplayName": "Plugin name:",
					"mandatory": true,
					"type": "LineEdit",
					"data": { "validator": "(?:(?:[a-zA-Z][a-zA-Z0-9]*::)*[a-zA-Z][a-zA-Z0-9]*|)" }
				},
				{
					"name": "PluginVersion",
					"trDisplayName": "Plugin Version:",
					"mandatory": true,
					"type": "LineEdit",
					"data": 
					{ 
						"trText": "1.0.0",
						"validator": "^[0-9a-zA-Z\.]+$" 
					}
				},
				{
					"name": "PluginDescription",
					"trDisplayName": "Plugin Description:",
					"type": "TextEdit",
					"data" :
					{
						"trText": "This is Plugin" ,
						"richText": true
					}
				},
				{
					"name": "PluginActivationPolicy",
					"trDisplayName": "Plugin Activation Policy:",
					"mandatory": true,
					"type": "ComboBox",
					"data":
					{
						"items": [ "lazy", "eager"]
					}
				},
				{
					"name": "PluginVendor",
					"trDisplayName": "Plugin Vendor:",
					"mandatory": true,
					"type": "LineEdit",
					"data": 
					{ 
						"trText":"LR"
					}
				},
				{
					"name": "PluginContactAddress",
					"trDisplayName": "Plugin Contact Address:",
					"mandatory": true,
					"type": "LineEdit",
					"data": 
					{ 
						"trText": "www.260487189@qq.com"
					}
				}
			]
		},
        {
            "trDisplayName": "Project Management",
            "trShortTitle": "Summary",
            "typeId": "Summary"
        }
    ],


	......
}
  • typeId:指定了页用在哪里【Fields, File, Form, Kits, Project, VcsConfiguration, VcsCommand 还是 Summary】;
  • trDisplayName:指定了页面标题;默认情况下,使用页面标题。
  • trShortTitle:指定向导侧边栏的标题;默认情况下,使用页面标题。
  • enable:为 true 时显示页面,为 false 时隐藏页面。
  • data:指定了向导页面的内容;在 C++ 向导中,它指定了一个 Fields 页和一个 Summary 页。 Fields 页包含了 CheckBox, ComboBox, LineEdit, PathChooser, 以及 Spacer 窗体部件
  • mandatory:如果小部件必须要有一个值才能开启 Next 按钮时为 true。默认为 true。
  • validator:指定一个 QRegularExpression 来验证行编辑器的输入内容。

3.2.4、文件生成

{
	//文件生成
	//------------------------------------------------------------------------------------------
	"generators":
	[
		{
    		"typeId": "File",
        	"data":
        	[
        		{
            		"source": "File.pro",
                	"target": "%{ProFile}",
                	"openAsProject": true
            	},
				{
                 	"source": "ImplFile.h",
                 	"target": "%{ImplHdrPath}",
                 	"openInEditor": true,
                 	"options": [
                 		{ "key": "Cpp:License:FileName", "value": "%{ImplHdrFileName}" },
                    	{ "key": "Cpp:License:ClassName", "value": "%{ImplCN}" }
                 	]
            	},

				......
        	]
		}
	]
}
  • typeId:指定生成器的类型。当前,仅支持File 或Scanner
  • data:允许进一步配置生成器;
  • source:指定模板文件
  • target:模板文件路径
  • Cpp:License:FileName:文件名
  • Cpp:License:ClassName:类名

四、实战

未完待续…

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

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

相关文章

软件测试——使用mujava测试过程中

文章目录下载对应安装包步骤二、修改代码第二部分&#xff0c;修改对应测试文件下载对应安装包 分别下载junit.jar、mujava.jar和openjava.jar三个包&#xff0c;并设定对应系统路径。三个安装包的下载路径以mujava.jar为例子 设置系统环境变量&#xff0c;计算机》属性》高级…

golang实现一个linux命令ls命令(命令行工具构建)

希望2023可以听到这些话&#xff1a; 恭喜你得到了这份工作恭喜你的建议被采用了恭喜你被录取了恭喜你的考试顺利通过了恭喜你上岸了恭喜你升职了恭喜你加薪了恭喜你体检结果一切正常在这篇文章下面许个愿吧&#xff01; ls 命令 要实现ls&#xff0c;首先先我们复习一下ls命令…

FPGA知识汇集-ASIC向FPGA的移植

ASIC原型验证是整个验证环节中非常重要的步骤之一&#xff0c;也是将ASIC的代码移植到FPGA平台上最重要的原因&#xff0c;本文章的意义在于&#xff1a; 对于系统构架师&#xff0c;将帮助他们在选择商用模拟器还是自行设计方案之间做出更好的选择&#xff1b; 对于逻辑工程师…

一文读懂Go Http Server原理

hello大家好呀&#xff0c;我是小楼&#xff0c;这是系列文《Go底层原理剖析》的第二篇&#xff0c;依旧是分析 Http 模块&#xff0c;话不多说&#xff0c;开始。 从一个 Demo 入手 俗话说万事开头难&#xff0c;但用 Go 实现一个 Http Server 真不难&#xff0c;简单到什么程…

2、Eclipse安装与使用

目录 一、简介 二、下载 三、Eclipse安装 &#xff08;1&#xff09;找到Eclipse安装包&#xff0c;右键【以管理员身份运行】 2.因为是写Java程序&#xff0c;所以安装第一个喽 3.安装位置设置&#xff08;不建议C盘安装哦&#xff09;&#xff0c;点击【INSTALL】 3.点…

day02 数组 | 977、有序数组的平方 209、长度最小的子数组 59、螺旋矩阵II

1、题目 977、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1…

github Page博客速度优化+Cloudflare_https两端配置+解决重定向次数过多问题

网站加速调优 自从加了CDN之后我的博客偶尔会报错”重定向次数过多“ 症状&#xff1a; XXX.XXX.XXX 将您重定向的次数过多。 尝试清除 Cookie. ERR_TOO_MANY_REDIRECTS 可能原因 参考阿里云cdn解决方案https://help.aliyun.com/document_detail/451418.html但是cloudflar…

【UCIe】UCIe Stall 介绍

&#x1f525;点击查看精选 UCIe 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0…

【SAP Hana】SAP Hana存储过程开发

SAP Hana存储过程开发Hana 存储过程1、创建&更新语法2、删除语法3、调用语法4、实例演示&#xff08;1&#xff09;存储过程入门&#xff08;2&#xff09;指定 DEFAULT SCHEMA&#xff08;3&#xff09;定义内部变量&#xff0c;执行多个查询&#xff08;4&#xff09;定义…

【Javascript】高阶函数,JSON,forEach,map,filter,reduce等高阶函数,函数绑定

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录高阶函数箭头函数apply函数JSONfilter函数map函数总结reduce函数find/findIndex函数every/some函…

【Android安全】frida-gum教程

frida-gum教程 frida-gum概述 frida-gum是基于inline-hook实现的 提供的功能&#xff1a;代码跟踪&#xff08;Stalker&#xff09;、内存访问监控&#xff08;MemoryAccessMonitor&#xff09;、符号查找、栈回溯实现、内存扫描、动态代码生成和重定位 inline Hook 原理 .…

MySQL中常见的数值函数

第一个 ceil(x)&#xff1a;向上取整 取整&#xff0c;顾名思义就是取整数&#xff1b; 向上取整是只要小数位不是 0&#xff0c;都会向上进 1 位整数。 案例 1&#xff1a; select ceil(9.2); 解析&#xff1a; 9.2 向上取一位整数&#xff0c;就是 10。 查询结果&#xff…

全屋智能品牌很多坑!选华为还是卡特加特数字家庭?技术角度分析亮了

市面上的智能家居品牌有很多&#xff0c;但拥有成熟全屋智能系统、完善产品体系&#xff0c;以及线下线上闭环销售渠道的则没几个。细数下来只有手机厂商华为、小米&#xff0c;以及科创型企业欧瑞博、摩根、UIOT和卡特加特&#xff0c;而其中以华为和卡特加特为代表的&#xf…

自定义类型:结构体,枚举,联合(3)

TIPS 1. 2. 枚举 1. 枚举顾名思义就是一一列举可能的取值&#xff0c;比如一周的星期一到星球天是有限的七天&#xff0c;可以一一列举。有比如性别&#xff0c;月份。 2. 像这种容易并且可以被一一列举的数据我们就可以定义为枚举类型。 枚举类型 1. 枚举的关键字为e…

【2】成功安装部署K8s集群

目录 1、安装方式 2、环境初始化 【1】主机名解析 【2】时间同步 【3】禁用iptables和firewalld服务&#xff08;三台都要设置&#xff09; 【4】禁用selinux&#xff08;三台都要设置&#xff09; 【5】禁用swap分区 【6】修改linux的内核参数 3、安装docker 【1】安…

自定义类型:结构体,枚举,联合(详解版)

&#x1f40b;自定义类型&#xff1a;结构体&#xff0c;枚举&#xff0c;联合&#x1f996;结构体&#x1f414;1.结构体的声明&#x1f424;1.1 结构的基础知识&#x1f424;1.2 结构的声明&#x1f424;1.3 特殊的声明&#x1f424;1.4 结构的自引用&#x1f424;1.5 结构体…

APSIM实战练习:Kingsthorpe土壤水分蒸发研究

在本练习中&#xff0c;您将对来自澳大利亚昆士兰州金斯索普的真实试验的数据进行建模。使用从试验中观察到的数据&#xff0c;您将创建一个气象文件&#xff0c;模拟三个蒸发曲线并将模拟输出与观察到的数据进行比较。 有关试用的更多背景信息&#xff0c;请参阅此 PowerPoin…

操作系统-进程与线程

进程的概念、组成、特征 概念 程序&#xff1a;是静态的&#xff0c;就是存放在磁盘里的可执行文件&#xff0c;如&#xff1a;QQ.exe。 线程&#xff1a;是动态的&#xff0c;是程序的一次执行过程&#xff0c;如&#xff1a;可同时启动多次QQ程序。 组成 进程由PCB、程序…

Java数组(复习)

Java数组 数组&#xff1a;数组是指一种容器&#xff0c;可以用来存储同种数据类型的多个值 数组容器在存储数据的时候&#xff0c;需要结合隐士转换考虑。例如&#xff1a;int类型的数组容器&#xff0c;可以存储byte&#xff0c;short&#xff0c;int类型的数组。double类型…

矩阵乘GPU性能优化之split k

矩阵乘计算GPU实现中通常为线程块计算一个较大的[m_tile, k] *[k, n_tile]的矩阵乘&#xff0c;最后分配到每个线程后同样为每个线程计算更小的一个[m_tile, k] *[k, n_tile]。 这样存在的一个问题主要是在于m和n较小而k很大时&#xff0c;如下图所示的矩阵乘案例&#xff0c;…