Qt Installer Framework使用教程:
步骤一:
下载并安装Qt Installer Framework工具
http://download.qt.io/official_releases/qt-installer-framework/
将安装目录添加到环境变量,如安装D盘时D:\Qt\QtIFW-4.5.0\bin
步骤二:
将测试例子(如D:\Qt\QtIFW-4.5.0\examples\tutorial)拷贝到某一目录如:D:\Qt\test config 目录: 配置 packages 目录: 安装包,里面可以有多个文件夹,一个文件夹代表一个安装组件(比如一个程序需要自身和数据库软件。就分为两个组件),每个文件夹下分data 和 meta 目录,data就是程序压缩包,meta是配置相关
步骤三:
修改版本号(config\config.xml, packages\com.vendor.product\meta\package.xml)
修改程序packages\com.vendor.product\data\xxx包中要安装的程序为最新。
步骤四:
打开Qt 5.12.4(MSVC2017 64-bit) 切换目录到打包文件夹: D:\Qt\test。
运行命令:binarycreator --offline-only -c config/config.xml -p packages xc2000-V1.0.3.0.exe
一些配置文件与函数说明:
Config目录中配置文件说明:
元素 是否必需 描述
Name 必需 正在安装的产品名称
Version 必需 安装软件的版本,格式要求:`[0-9]+((.
Title 可选 标题栏上显示的安装程序的名称
Publisher 可选 软件发行商(如Windows控制面板中所示)
ProductUrl 可选 指向包含您网站上产品信息的网页的网址
Icon 可选 自定义安装程序图标的文件名。通过附加'.icns'(OS X),'.ico'(Windows)或'.png'(Unix)后缀来查找实际文件。 已弃用 ,请改用<InstallerApplicationIcon>或<InstallerWindowIcon>
InstallerApplicationIcon 可选 自定义安装程序图标的文件名。 通过附加'.icns'(OS X),'.ico'(Windows)后缀来查找实际文件。 在Unix上没有此功能
InstallerWindowIcon 可选 安装程序应用程序的自定义窗口图标的文件名(PNG格式)
Logo 可选 用作QWizard::LogoPixmap的徽标的文件名
Watermark 可选 用作QWizard::WatermarkPixmap的水印的文件名
Banner 可选 用作QWizard::BannerPixmap(横幅)的文件名(仅由ModernStyle使用)
Background 可选 用作QWizard::BackgroundPixmap的图像的文件名(仅由MacStyle使用)
WizardStyle 可选 设置要使用的向导样式 ("Modern"(现代), "Mac", "Aero"或"Classic"(经典))
WizardDefaultWidth 可选 像素单位的默认向导(Wizard)宽度,设置的横幅图像(Banner Image)将覆盖在此
WizardDefaultHeight 可选 以像素为单位设置向导的默认高度,设置水印图像将覆盖在此
TitleColor 可选 设置标题和字幕的颜色(采用HTML颜色代码,例如“#88FF33”)
RunProgram 可选 如果用户接受操作,则在安装程序完成后执行命令。要提供应用程序的完整路径
RunProgramArguments 可选 传递给<RunProgram>中指定的程序的参数。您可以添加多个<Argument>子元素,每个子元素为<RunProgram>指定一个参数
RunProgramDescription 可选 安装后运行程序的复选框旁边显示的文本。如果<RunProgram>设置,但没有提供说明,用户界面将显示运行程序<Name>替代
StartMenuDir 可选 Windows开始菜单中产品的默认程序组名称
TargetDir 可选 安装的默认目标目录。在Linux上,这通常是用户的主目录(/home/username/)
AdminTargetDir 可选 具有管理员权限的安装的默认目标目录。仅在Linux上可用,通常不建议在管理员用户的主目录中安装
RemoteRepositories 可选 远程存储库列表。此元素可以包含多个<Repository>子元素,每个子元素包含指定用于访问存储库的URL的<Url>子元素。有关更多信息,请参阅配置存储库
MaintenanceToolName 可选 生成的维护工具的文件名。默认为maintenancetool。将附加平台特定的可执行文件扩展名
MaintenanceToolIniFile 可选 用于生成维护工具配置的文件名。默认为MaintenanceToolName.ini
RemoveTargetDir 可选 如果卸载时不删除目标目录(TargetDir),请设置为false
AllowNonAsciiCharacters 可选 如果安装路径可以包含 非ASCII字符 ,请设置为true
RepositorySettingsPageVisible 可选 设置为false来 隐藏 设置对话框中的 存储库设置页面
AllowSpaceInPath 可选 如果安装路径 不能包含空格字符 ,请设置为false
DependsOnLocalInstallerBinary 可选 如果要禁止从外部资源(如网络驱动器)安装,请设置为true。 这可能有意义,例如,安装程序非常大。该选项仅在Windows上使用
TargetConfigurationFile 可选 目标的配置文件名。默认是components.xml
Translations 可选 用于翻译用户界面的语言代码列表。要添加多个语言变体,请指定多个<Translation>子元素,每个元素指定语言变体的名称。该项可选。有关详细信息,请参阅翻译页
UrlQueryString 可选 此字符串必须采用key = value形式,并且将附加到存档下载请求。这可以用于向托管存储库的web服务器传输信息
ControlScript 可选 自定义安装程序控制脚本的文件名。请参阅控制脚本
CreateLocalRepository 可选 如果要在安装目录中 创建本地存储库 ,请设置为true。此选项对在线安装程序没有影响。存储库将自动添加到默认存储库列表
Package目录中配置文件说明:
元素 是否必需 描述
DisplayName 必需 组件的可读名称
Description 必需 组件的可读描述。将描述的翻译指定为附加说明标记的值,并将xml:lang属性设置为正确的语言环境。如果找不到与语言环境匹配的翻译文件,且存在未翻译的版本,则使用未翻译版本。否则,将不显示该描述
Version 必需 组件的版本号格式为:`[0-9]+((.
ReleaseDate 必需 此组件版本发布的日期
Name 必需 此组件的域标识
Dependencies 可选 此组件依赖的组件的标识符列表(使用逗号分割)。您可以指定版本号,以破折号(-)分隔。您可以使用比较运算符(=, >, <, >= or <=)为版本号添加前缀。请记住,您必须使用字符引用&lt;来避开左尖括号(使用<来插入<,使用&lt; =来插入<=)。更多相关信息,请参阅组件依赖关系
AutoDependOn 可选 此组件具有自动依赖性的组件的标识符列表(逗号分隔)。当且仅当 满足所有指定的依赖关系 时,才安装组件。如果组件对其他组件有自动依赖性,则组件树中组件旁的复选框将隐藏,并自动进行选择。如果组件以前未安装,则只有当选择此列表中的所有组件进行安装时,才会选择安装组件。如果组件已安装,则当选择此列表中的 至少一个组件 进行卸载时,将选择卸载组件。有关更多信息,请参阅组件依赖关系
Virtual 可选 设置为true可从安装程序中隐藏组件。请注意,在根组件上设置此选项不起作用
SortingPriority 可选 组件在组件树中的优先级。 树从最高优先级到最低优先级排序,在顶部具有最高优先级
Licenses 可选 安装用户接受的许可协议列表。要添加几个许可证,请添加几个<License>子元素,每个子元素指定许可证名称和文件。 如果有针对此组件列出的翻译,安装程序还将查找翻译的许可证。 它们需要具有与原始许可证文件相同的名称,但是具有添加的区域设置标识符。 例如,如果许可证文件被称为license.txt并且指定了德语翻译,且安装程序还包含一个license_de_de.txt文件(将在德语系统上安装时显示)
Script 可选 被加载的脚本文件名。有关详细信息,请参阅添加操作
UserInterfaces 可选 要加载的页面列表。 要添加多个页面,请添加多个<UserInterface>子元素,每个子元素指定页面的文件名。有关详细信息,请参阅添加页面
Translations 可选 要加载的翻译文件的列表。要添加多个语言变体,请指定多个<Translation>子元素,每个子元素指定语言变体的文件名。有关详细信息,请参阅翻译页
UpdateText 可选 如果这是一个更新组件,则将说明添加到组件描述中
Default 可选 可以设置为true、false、脚本名。true:在安装程序中预先选中组件。此操作仅适用于没有可见子组件的组件。脚本名:在运行时解析执行脚本,计算出布尔值(boolean)。将脚本文件名称添加为此文件中<Script>元素的值。有关脚本示例,请参阅Selecting Default Contents
Essential 可选 将包标记为必须去强制重启MaintenanceTool程序的。如果有 可用的必要组件更新 ,则程序包管理器保持禁用状态直到该组件更新。当运行updater时,新引入的必要组件将自动安装
ForcedInstallation 可选 确定必须安装的包。最终用户无法在安装程序中取消选择它
Replaces 可选 要替换的组件列表(逗号分隔)
DownloadableArchives 可选 列出数据文件(逗号分隔),供在线安装程序下载。如果组件中有一些数据,并且package.xml和(或)脚本没有DownloadableArchives值,repogen工具将自动注册找到的数据
RequiresAdminRights 可选 如果程序包需要提升权限进行安装,请设置为true
Operation 语法 用法
Copy "Copy" source target 从source复制一个文件到target
Move "Move" source target 从source移动一个文件到target
SimpleMoveFile "SimpleMoveFile" source target 从source移动一个文件到target
Delete "Delete" filename 删除filename.指定的文件
Mkdir "Mkdir" path 创建path目录
Rmdir "Rmdir" path 删除path目录
CopyDirectory "CopyDirectory" sourcePath targetPath 复制sourcePath目录到targetPath
AppendFile "AppendFile" filename text 将text追加到filename指定的文件。text被视为ASCII文本
PrependFile "PrependFile" filename text 将text添加到filename指定的文件。text被视为ASCII文本
Replace "Replace" file search replace 打开文件去查找search字符串,并替换为replace字符串
LineReplace "LineReplace" file search replace 打开文件以查找以search字符串开头的行,并用replace字符串替换它。Lines are trimmed before the search.
Execute "Execute" [{exitcodes}] command [parameter1 [parameter... [parameter10]]] 执行命令指定的命令。 最多可以传递10个参数。 如果这还不够,可以使用JavaScript字符串数组。可选,您可以在大括号{}中传递以逗号分隔的退出代码列表作为第一个参数,以指定成功执行的退出代码。 默认为{0}。其它可选的命名参数是:"workingdirectory=<your_working_dir>"; "errormessage=<your_custom_errormessage>"此外,一个特殊的参数UNDOEXECUTE将操作的DO步骤与UNDO步骤分开。示例:component.addOperation("Execute", "touch", "test.txt", "UNDOEXECUTE", "rm", "test.txt")
CreateShortcut "CreateShortcut" filename linkname [arguments] 为filename指定的文件创建一个名为linkname的快捷方式。在Windows上,将创建一个可带参数的 .lik 文件。在Unix上,将创建一个符号链接
CreateDesktopEntry "CreateDesktopEntry" filename "key=value[ key2=value2[ key3=value3]]]" 创建一个.desktop初始化文件,如freedesktop.org指定的。如果filename是绝对路径,则桌面条目存储在那里。 否则,它存储在$XDG_DATA_DIRS/applications或$XDG_DATA_HOME/applications中指定的位置,包括由freedesktop.org定义的两者的默认路径。键值对将写入文件。该文件设置为使用UTF-8编码
InstallIcons "InstallIcons" directory [Vendorprefix] 将目录的内容安装到由freedesktop.org指定的位置。也就是$XDG_DATA_DIRS/icons,/usr/share/icons或$HOME/.icons。 文件将从其初始位置删除。请确保在从归档中提取文件的操作之后添加此操作。如果您提供Vendorprefix,它会替换所有字符,直到遇到 带有此前缀 的图标文件名中的第一个破折号-
Extract "Extract" archive targetdirectory 提前archive内容到targetdirectory
GlobalConfig "GlobalConfig" company application key value
或"GlobalConfig" scope company application key value或"GlobalConfig" filename key value 在配置文件中存储键的值。 配置文件由文件名(使用QSettings::NativeFormat,可能是Windows注册表)或应用程序和公司名称指定。将范围设置为SystemScope以在系统范围中创建条目。注意: 该操作当前使用QSettings来存储键值对。QSettings始终将反斜杠视为特殊字符,并且不提供用于读取或写入此类条目的API。不要在段落或键名称中使用斜杠(/和''); 反斜杠字符用于分隔子键。 在Windows中,''被QSettings转换为/,这使它们相同。 因为QSettings使用反斜杠字符来分隔子键,所以 无法读取或写入包含斜杠或反斜杠的Windows注册表项 。 如果需要,您应该使用本机Windows API。
EnvironmentVariable "EnvironmentVariable" key value [persistent [system]] 设置环境变量key为value如果persistent设置为true,那么将永久设置该变量。目前仅支持Windows。如果system设置为true,则该变量设置在系统范围内有效,而不是仅对当前用户
RegisterFileType "RegisterFileType" extension command [description [contentType [icon]]] 注册要通过命令打开的扩展名的文件类型。 可选,你可以指定描述(description)、内容类型(contentType)和图标(icon)。当前仅支持Windows
ConsumeOutput "ConsumeOutput" installerKeyName executablePath processArguments 保存运行带有参数processArguments的executablePath的可执行文件的输出到installerKeyName指定的安装程序键。 可以传递其他参数
CreateLink "CreateLink" linkPath targetPath 创建从linkPath指定的位置到由targetPath指定的位置的链接
CreateLocalRepository "CreateLocalRepository" binaryPath repoPath 创建一个本地存储库在repoPath指定的目录。对于离线安装程序,将二进制数据存储在binaryPath指定的目录
FakeStopProcessForUpdate "FakeStopProcessForUpdate" processlist 在卸载期间匹配运行进程与processlist中的条目(逗号分隔)。 如果找到匹配,则显示一个消息框,要求用户在继续之前停止这些进程
License "License" licenses 将licenses指定的许可证文件复制到目标目录中名为Licenses的子文件夹。对于在包描述文件中声明的包,将自动添加此操作
MinimumProgress "MinimumProgress" 将进度值增加1
SelfRestart "SelfRestart" core 重新启动由core指定的updater或软件包管理器
Settings "Settings" path method key aValue 根据method的值:set、remove、add_array_value和remove_array_value,来设置或删除位于path的settings文件或注册表中key的值aValue
一此常用方法:
function Controller() {
// 判断是否是卸载程序
if(installer.isUninstaller()){
installer.uninstallationStarted.connect(this, this.uninstallationStarted);
}
// 判断是否是安装程序
if(installer.isInstaller()){
installer.installationStarted.connect(this,this.installationStarted);
}
}
// 卸载开始前需要执行的操作
Controller.prototype.uninstallationStarted = function() {
installer.execute("touch","/home/centos/test_TTTTT");
installer.execute("mkdir","/home/centos/TestWorkstation");
installer.execute("mkdir","${HOME}/TestWorkstation/Databases");
installer.execute("cp",["/home/centos/TestWorkstation/app.png","/home/centos/TestWorkstation/test"]);
}
// 开始安装前执行的操作
Controller.prototype.installationStarted = function() {
installer.execute("touch","/home/centos/test_Start");
}
范例
要安装一个test 软件,,他依赖安装数据库
config 目录下分两个文件config.xml 、 controller.qs
<?xml version="1.0" encoding="UTF-8"?>
<Installer>
<Name>Test</Name>
<Version>1.0.3.0</Version>
<Title>Test</Title>
<Publisher>xxxxx</Publisher>
<InstallerApplicationIcon>app</InstallerApplicationIcon>
<StartMenuDir>Test</StartMenuDir>
<MaintenanceToolName>UnTest</MaintenanceToolName>
<TargetDir>D:\Test\</TargetDir>
<RemoveTargetDir>false</RemoveTargetDir>
<CreateLocalRepository>true</CreateLocalRepository>
<InstallActionColumnVisible>true</InstallActionColumnVisible>
<ControlScript>controller.qs</ControlScript>
</Installer>
function Controller()
{
// 判断是否是卸载程序
if(installer.isUninstaller()){
installer.uninstallationStarted.connect(this, this.uninstallationStarted);
}
}// 卸载开始前需要执行的操作
Controller.prototype.uninstallationStarted = function() {
installer.execute("@TargetDir@/uninstall-db.bat");
}
packages 目录下两个目录 Test 和TestDB ,分别安装软件和数据库
其中Test目录下的meta下配置 package.xml、test.qs 分别如下
<?xml version="1.0"?>
<Package>
<DisplayName>Test</DisplayName>
<Description>Test版本1.0.3.0主要功能程序.</Description>
<Version>1.0.3.0</Version>
<ReleaseDate>2022-12-26</ReleaseDate>
<Default>true</Default>
<Script>test.qs</Script>
<SortingPriority>100</SortingPriority>
</Package>
function Component()
{
// default constructor
}Component.prototype.createOperations = function()
{
// call default implementation to actually install README.txt!
component.createOperations();if (systemInfo.productType === "windows") {
component.addOperation("CreateShortcut", "@TargetDir@/Test/Test.exe", "@HomeDir@/Desktop/Test.lnk");
component.addOperation("CreateShortcut", "@TargetDir@/Test/Test.exe", "@StartMenuDir@/Test.lnk");
component.addOperation("CreateShortcut", "@TargetDir@/UnTest.exe", "@StartMenuDir@/UnTest.lnk");
}
}
TestDB目录下配置如下
<?xml version="1.0"?>
<Package>
<DisplayName>数据库</DisplayName>
<Description>Test程序支持的数据库.</Description>
<Version>5.7.29</Version>
<ReleaseDate>2014-08-25</ReleaseDate>
<Default>false</Default>
<Script>dbTest.qs</Script>
<SortingPriority>90</SortingPriority>
</Package>
function Component() {
installer.finishButtonClicked.connect(this, Component.prototype.installationFinished);
}Component.prototype.createOperations = function()
{
component.createOperations();
}Component.prototype.installationFinished = function()
{
if(component.isInstalled())
{
try
{
if (installer.isInstaller() && installer.status == QInstaller.Success)
{
installer.execute("@TargetDir@/install-db.bat");
}
}
catch(e)
{
console.log(e);
}
}
}
相关文章:
Qt Installer Framework使用教程:
步骤一: 下载并安装Qt Installer Framework工具 http://download.qt.io/official_releases/qt-installer-framework/ 将安装目录添加到环境变量,如安装D盘时D:\Qt\QtIFW-4.5.0\bin 步骤二: 将测试例子(如D:\Qt\QtIFW-4.5.0\…...
nodejs+vue+java农村信息化服务平台
用户的登录模块:用户登录本系统,对个人的信息等进行查询,操作可使用的功能。 用户注册模块:游客用户可以进行用户注册,系统会反馈是否注册成功。 添加管理员模块:向本系统中添加更多的管理人员,…...
代码随想录补打卡 62不同路径 63 不同路径2
代码如下 func uniquePaths(m int, n int) int { dp : make([][]int,m) //定义一个二维数组 for i : 0 ; i < m ; i { //遍历这个二维数组的每个元素,并将每个元素都定义为一个一维数组 dp[i] make([]int,n) //这样就生成了图中的一个二维网格 dp[i][0] …...
树的存储和遍历
文章目录 6.5 树与森林6.5.1 树的存储结构1. 双亲表示法(顺序存储结构)2 孩子链表表示法3 孩子兄弟表示法(二叉树表示法) 6.5.2 森林与二叉树的转换1 树转换成二叉树2 二叉树转换成树3 森林转换成二叉树4 二叉树转换成森林 6.5.3 树和森林的遍历1. 树的遍历2. 森林的遍历 6.6 赫…...
MySQL的ID用完了,怎么办?
目 录 一 首先首先分情况 二 自增ID 1 mysql 数据库创建一个自增键的表 2 导出表结构 3 重新创建 自增键是4294967295的表 4 查看表结构 5 异常测试 三 填充主键 1 首先创建一个test 表,主键不自增 2 插入主键最大值 3 再次插入主键最大值1 四 没有声明…...
JSP基于Iptables图形管理工具的设计与实现(源代码+论文)
Netfilter/Iptables防火墙是Linux平台下的包过滤防火墙,Iptables防火墙不仅提供了强大的数据包过滤能力,而且还提供转发,NAT映射等功能,是个人及企业级Linux用户构建网络安全平台的首选工具。但是,由于种种原因&#x…...
什么是数据库分片?
什么是数据库分片? 数据库分片是指将一个大型数据库拆分成多个小型数据库,每个小型数据库称为一个分片。通过这种方式,可以将数据库的负载分散到多个服务器上,从而提高数据库的性能和可伸缩性。 为什么需要数据库分片?…...
软件工程知识点
软件工程提出的时代和背景 软件工程化的层次 软件开发过程 敏捷与计划开发 演化式开发和DevOps 软件配置管理过程和相关工具名 软件质量和代码异味 能够分析常见的代码异味和bug 代码复杂度和计算圈复杂度 了解代码异味和重构行为的关系 了解自动化单元测试框架xunit…...
华为OD机试 - 投篮大赛(Python)
题目描述 你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。 比赛开始时,记录是空白的。 你会得到一个记录操作的字符串列表 ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则: 整数x-表示本回合…...
《花雕学AI》讯飞星火认知大模型的特点和优势,与ChatGPT的对比分析
引言: 人工智能是当今科技领域的热门话题,自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言,实现人机交互和智能服务。近年来,随着深度学习的发展,自然语言处理领域出现了许多创…...
【Python入门】Python的判断语句(if else 语句)
前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…...
(4.28-5.4)【大数据新闻速递】数字中国峰会成功举办;“浙江数据知识产权登记平台”上线;贵州大数据活跃;AI教父从谷歌离职
01【2023年数字中国建设峰会数字福建分论坛成功举办】 2023年数字中国建设峰会数字福建分论坛由福建省人民政府主办,福建省数字福建建设领导小组办公室、数字中国研究院(福建)和福建省大数据集团承办。分论坛于2023年4月28日下午14:30 -17:3…...
领域驱动设计(Domain Driven Design)之建立领域模型
文章目录 用领域模型表达领域概念建立模型使用通用语言验证模型识别构造块类型设计聚合如何使用领域模型再次思考总结用领域模型表达领域概念 在实际项目中,模型设计者往往过早陷入具体构造块类型的识别,比如实体、聚合、领域服务,而忽略了领域模型表达领域概念的目的。我们…...
有研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具(下)
导语:研究员公开了一个解析并提取 Dell PFS BIOS 固件的工具。 Apple EFI IM4P分配器 介绍 解析苹果多个EFI固件.im4p文件,并将所有检测到的EFI固件分割为单独的SPI/BIOS映像。 使用 你可以拖放或手动输入包含Apple EFI IM4P固件的文件夹的完整路径。…...
iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言、ObjC的特性,且克服了C语言的兼容性问题。Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在其中你可以看到C#、Java、Javascript、Pyth…...
【MOMO】高水平期刊目录(持续更新)
高水平期刊目录 引言1 顶级期刊目录(A)1.1 IEEE Transactions on Intelligent Transportation Systems1.2 IEEE Transactions on Neural Networks and Learning Systems1.3 Engineering 2 权威期刊目录(A)2.1 Measurement 3 鼓励期…...
LVS负载均衡集群--DR模式
一、LVS-DR集群介绍 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用࿰…...
RabbitMQ --- 死信交换机
一、简介 1.1、什么是死信交换机 什么是死信? 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false…...
如何在个人web项目中使用会话技术(cookiesession)?
编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录 一. 什么是会话?二. 为什么要使用会话技术?三. 如何使用会话技术?3.1 Cookie(客户端的会话技术…...
创建线索二叉树
创建线索二叉树 一、创建线索二叉树一、案例1、前序线索二叉树2、中序线索二叉树3、后序线索二叉树 一、创建线索二叉树 现将某结点的空指针域指向该结点的前驱后继,定义规则如下: 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点。…...
HNU-操作系统OS-实验Lab2
OS_Lab2_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 前言 实验一过后大家做出来了一个可以启动的系统,实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存,还需高效地管理…...
如何使用HTML和CSS创建有方向感知的按钮
在互联网应用中,按钮是一种常见的控件,用户通过点击按钮来触发相应的操作。考虑到用户体验和交互设计,设计有方向感知的按钮可以使得用户更加易于理解按钮的功能和状态。 在本文中,我们将介绍如何使用HTML和CSS来创建具有方向感知…...
java 线程安全
内部锁 在 Java 中,每个对象都有一个内部锁,也称为监视器锁或对象锁。内部锁是通过在代码块或方法前加上 synchronized 关键字来实现的。当一个线程执行一个带有 synchronized 关键字的方法或代码块时,它必须先获得该对象的内部锁࿰…...
移动硬盘修复后文件丢失恢复方法
最近收到很多这样的咨询: 问1:移动硬盘目录损坏用chkdsk修复后,文件被删除,怎么才可以恢復文件? 问2:移动硬盘出错然后修复,然后文件都没有了怎么处理啊!!!&a…...
直线飙升到10万+star的AutoGpt,有多强?帮我写了个网页!
先来感受一下10万的star,到底有多强! 从4月2日开始,直线飙升到10万star Auto-GPT是一个实验性的开源应用程序,展示了GPT-4语言模型的功能。这个程序由GPT-4驱动,将LLM“思想”链接在一起,以自主实现您设定的…...
rk3568平台调试typec口实现uvc输出,网络共享等功能
一、修改kernel相关配置 注意:一定要知道主控接线,那个物理口是otg的,然后要找准与之所连接的phy和控制器。然后处理CC1 CC2识别芯片,fusb302。默认sdk自带有驱动,需要配上中断脚和提供VBUS 5V的脚。用来判断角色是DF…...
java基础知识——26.反射
这篇文章我们来讲一下java的代理与反射,这是很重要的一部分内容。 目录 1.什么是反射 2.获取class对象的三种方式 3.反射获取构造方法 4.利用反射来获取成员变量 5.利用反射来获取成员方法 6.反射的作用 7.反射小结 1.什么是反射 首先,我们来看…...
【容器化】Docker 简介和安装
【容器化】Docker 简介和安装 DockerDocker的应用场景Docker 的优点1、快速,一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 Docker 架构Docker 安装Ubuntu Docker 、Debian Docker 安装使用官方安装脚本自动安装手动安装使用 Shell 脚…...
性能测试场景分析并设计?超细案例讲解,看这篇就够了
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试场景&…...
JAVA9新特性
JAVA9新特性 概述 经过4次推迟,历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统,在最初设想的时候并没有想过那么复杂,花费的时间超出预估时间。距离java8大约三年时间。 Java 9提供了超过150项新功能特性&#x…...
小破站下载/seo搜索优化培训
导读有时我们会在网上下载一些proe或者Creo模型,由于不知道这些模型具体版本,使用软件打开时可能会在信息栏提示“xxx不能检索”,这是因为Proe和Creo的低版本是无法打开高版本的。难道我们必须需要安装高版本的软件吗?我只是想欣赏一下模型而…...
网站开发外贸/怎么做优化关键词
2019独角兽企业重金招聘Python工程师标准>>> Laravel使用PHP的一个扩展API–Carbon来处理时间。它提供了很多日期操作方法,其中 diffForHumans() 可以把日期转换成 “1 hours age”、“4 years age” 这样的格式,同时,它还支持本地…...
阜新网站建设公司/ps培训
Set 属性: Set.prototype.constructor:Set.prototype.size:方法 操作方法 adddeletehasclearArray.from()可以将Set结构转为数组遍历方法 keys():返回键名的遍历器,结果与values()相同values(): 返回键值的遍历器entries():返回键值对的遍历器forEach(value…...
做网站大公司有哪些/百度seo效果
内容出自《代码整洁之道》、Alex Kondov[1]的博文tao-of-react[2]和《Clean Code of Javascript》image.png代码整洁有什么用?image.png思路清晰,降低bug几率更容易维护,利于团队协作看起来舒服,提高效率......软件质量与代码整洁…...
wordpress 自动同步工具/家居seo整站优化方案
可滚动组件中缓存指定子项的通用方案 在介绍 ListView 时,有一个addAutomaticKeepAlives 属性我们并没有介绍,如果addAutomaticKeepAlives 为 true,则 ListView 会为每一个列表项添加一个 AutomaticKeepAlive 父组件。 虽然 PageView 的默认…...
南宁企业免费建站/seo是什么部位
前文回顾:如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1)如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2)如何掌握openGauss数据库核心技术?…...