控制脚本

对于每个安装程序,您可以指定一个控制脚本,用来与安装程序的部分UI或功能进行交互。控制脚本可以在向导中添加和删除页面,更改现有页面,进行附加检查以及通过模拟用户单击来与UI交互。例如,这允许安装时无需人的参与。

脚本格式必须与QJSEngine兼容。

本节介绍为实现这种控制脚本而调用的函数功能。它还概述了安装程序页面以及每个页面上可用的小部件,例如按钮,单选按钮和行编辑。

编写控制脚本

最小的有效脚本至少需要包含一个构造函数,如下所示:

function Controller()
{
}

以下示例显示了一个更高级的脚本,该脚本使用gui JavaScript全局对象方法,用于在简介页面上设置新页面标题和欢迎消息,并在目标文件夹页面上自动单击下一步按钮:

function Controller()
{
} Controller.prototype.IntroductionPageCallback = function()
{
var widget = gui.currentPageWidget(); // get the current wizard page
if (widget != null) {
widget.title = "New title."; // set the page title
widget.MessageLabel.setText("New Message."); // set the welcome text
}
} Controller.prototype.TargetDirectoryPageCallback = function()
{
gui.clickButton(buttons.NextButton); // automatically click the Next button
}

有关可在控制脚本中使用的JavaScript全局对象的更多信息,请参见Scripting API章节。

预定义的安装程序页面

QInstaller JavaScript对象提供对以下预定义安装程序页面的访问:

> 介绍

> 目标文件夹

> 组件选择

> 许可证检查

> 开始菜单选择

> 准备安装

> 执行安装

> 安装完成

buttons JavaScript对象提供了一组可在安装程序页面上使用的按钮。

以下各节描述了可与安装程序页面交互的用户可实现函数,以及每个页面上可用的小部件。

简介页面

实现Controller.prototype.IntroductionPageCallback()函数,用来与简介页面上的部件进行交互。

向导按钮:

> 下一步按钮

> 取消按钮

部件 简要描述
ErrorLabel 显示错误信息
MessageLabel 显示消息。默认显示"欢迎来到安装向导"消息。
InformationLabel 显示进度信息。
单选按钮 简要描述
PackageManagerRadioButton 包管理器单选按钮,作为维护工具运行时,在页面上显示。
UpdaterRadioButton 更新程序单选按钮,作为维护工具运行时,在页面上显示。
UninstallerRadioButton 卸载程序单选按钮,作为维护工具运行时,在页面上显示。
进度条 简要描述
InformationProgressBar 进度条,获取远程包时显示。
Qt核心功能 简要描述
packageManagerCoreTypeChanged() 如果要在维护工具的类型更改时收到通知,请连接到此信号。
注意:仅当用户启动二进制文件,即所谓的维护工具(安装后),并在单选按钮之间切换时,才发出此信号。

示例代码:

function Controller()
{
var widget = gui.pageById(QInstaller.Introduction); // get the introduction wizard page
if (widget != null)
widget.packageManagerCoreTypeChanged.connect(onPackageManagerCoreTypeChanged);
} onPackageManagerCoreTypeChanged = function()
{
console.log("Is Updater: " + installer.isUpdater());
console.log("Is Uninstaller: " + installer.isUninstaller());
console.log("Is Package Manager: " + installer.isPackageManager());
}

许可协议页面

实现Controller.prototype.LicenseAgreementPageCallback()函数,用来与许可协议页面上的部件进行交互。

向导按钮:

> 下一步按钮

> 取消按钮

> 返回按钮

部件 简要描述
LicenseListWidget 列出可用许可证
LicenseTextBrowser 显示被选择许可证内容
AcceptLicenseLabel 在接受许可证单选按钮旁边显示的文本
RejectLicenseLabel 在拒绝许可证单选按钮旁边显示的文本
单选按钮 简要描述
AcceptLicenseRadioButton 接收许可协议
RejectLicenseRadioButton 拒绝许可协议。默认选中。

目标文件夹页面

实现Controller.prototype.TargetDirectoryPageCallback()函数,用来与目标文件夹选择页面上的部件进行交互。

向导按钮:

> 下一步按钮

> 取消按钮

> 返回按钮

部件 简要描述
MessageLabel 显示消息
TargetDirectoryLineEdit 显示安装目标文件夹值
WarningLabel 显示警告

组件选择页面

实现Controller.prototype.ComponentSelectionPageCallback()函数,用来与组件选择页面上的部件进行交互。

向导按钮:

> 下一步按钮

> 取消按钮

> 返回按钮

方法 简要描述
selectAll() 尽可能选择所有可用包
deselectAll() 尽可能反选所有可用包
selectDefault() 将可用包的选择状态重置为初始状态
selectComponent(id) 选择具有id(string)的包
deselectComponent(id) 反选具有id(string)的包
按钮 简要描述
SelectAllComponentsButton 尽可能选择所有可用包
DeselectAllComponentsButton 尽可能反选所有可用包
SelectDefaultComponentsButton 将可用包的选择状态重置为初始状态
ResetComponentsButton 重置为已安装组件状态
FetchCategoryButton 从类别中获取组件
部件 简要描述
CategoryGroupBox 包含用于选择存储库类别的复选框

Installer Framework 3.1引入了存储库类别,作为一项新功能。 使用包含存储库类别的安装程序时,可以按其显示名称选择类别,获取其内容,然后选择包含的组件进行安装。

您可以从类别中获取组件,如下所示:

Controller.prototype.ComponentSelectionPageCallback = function()
{
var page = gui.pageWidgetByObjectName("ComponentSelectionPage"); // if CategoryGroupBox is visible, check one of the checkboxes
// and click fetch button before selecting any components
var groupBox = gui.findChild(page, "CategoryGroupBox");
if (groupBox) {
console.log("groupBox found");
// findChild second argument is the display name of the checkbox
var checkBox = gui.findChild(page, "Archive");
if (checkBox) {
console.log("checkBox found");
console.log("checkBox name: " + checkBox.text);
if (checkBox.checked == false) {
checkBox.click();
var fetchButton = gui.findChild(page, "FetchCategoryButton");
if (fetchButton) {
console.log("fetchButton found");
fetchButton.click();
} else {
console.log("fetchButton NOT found");
}
}
} else {
console.log("checkBox NOT found");
}
} else {
console.log("groupBox NOT found");
}
// you can now select components from the fetched category
}

开始菜单文件夹页面

实现Controller.prototype.StartMenuDirectoryPageCallback()函数,用来与准备安装页面上的部件进行交互。

向导按钮:

> 下一步按钮

> 取消按钮

> 返回按钮

部件 简要描述
StartMenuPathLineEdit 显示用于创建程序快捷方式的文件夹。

准备安装页面

实现Controller.prototype.ReadyForInstallationPageCallback()函数,用来与准备安装页面上的部件进行交互。

向导按钮:

> 提交按钮

> 取消按钮

> 返回按钮

部件 简要描述
MessageLabel 显示消息。
TaskDetailsBrowser 显示有关安装的一些更详细的信息

执行安装页面

实现Controller.prototype.PerformInstallationPageCallback()函数,用来与执行安装页面上的部件进行交互。

向导按钮:

> 提交按钮

> 取消按钮

完成页面

实现Controller.prototype.FinishedPageCallback()函数,用来与安装完成页面上的部件进行交互。

向导按钮:

> 提交按钮

> 取消按钮

> 完成按钮

部件 简要描述
MessageLabel 显示消息。
RunItCheckBox 文本字段,通知用户可以在安装完成后启动应用程序。

自定义页面

自定义页面被注册为Dynamic${ObjectName},其中${ObjectName}是在UI文件中设置的对象名称。 因此,将调用Dynamic${ObjectName}Callback()函数。通过部件的对象名称(从UI文件)可以实现对部件的访问。

示例代码:

function Component()
{
// add page with widget \c SomePageWidget before the target directory page
installer.addWizardPage(component, "SomePageWidget", QInstaller.TargetDirectory)
} Component.prototype.DynamicSomePageWidgetCallback = function()
{
var page = gui.pageWidgetByObjectName("DynamicSomePageWidget");
page.myButton.click, //direct child of the UI file's widget
page.someFancyWidget.subWidget.setText("foobar") // nested widget
}

消息框

在执行安装程序时,例如,程序可能会显示一些有关发生错误的消息框。 在用户系统上运行程序时,这没问题,但这可能会破坏自动化测试套件。 为解决此问题,Qt Installer框架显示的所有消息框,均可通过特定标识符进行访问。

标识符 可选值 描述
OverwriteTargetDirectory Yes, No 确认使用已有文件夹作为安装目标文件夹
installationError OK, Retry, Ignore 执行安装时发生致命错误。
installationErrorWithRetry Retry, Ignore, Cancel 执行安装时发生错误。 最终可以选择重试以再次运行。
AuthorizationError Abort, OK 无法获取提升的权限。
OperationDoesNotExistError Abort, Ignore 尝试执行操作时发生错误,但该操作不存在。
isAutoDependOnError OK 调用包脚本时发生错误。 无法评估该包是否对其他包具有自动依赖性。
isDefaultError OK 调用包脚本时发生错误。 无法评估该包是否默认安装。
DownloadError Retry, Cancel 从远程存储库下载存档哈希时发生错误。 用户可以选择重试。
archiveDownloadError Retry, Cancel 从远程存储库下载档案时发生错误。用户可以选择重试。
WriteError OK 写入维护工具时发生错误。
ElevationError OK 无法获取提升的权限。
unknown OK 删除某些包时发生未知错误。
Error OK 通用错误。
stopProcessesForUpdates Retry, Ignore, Cancel 更新包时发生错误。 必须先退出一些正在运行的应用程序或进程,然后才能执行更新。用户可以选择“重试”以在停止后在此运行。
Installer_Needs_To_Be_Local_Error OK 安装程序是从网络位置启动的,但是不支持通过网络进行安装。
TargetDirectoryInUse No 安装的目标文件夹已经包含其他安装。
WrongTargetDirectory OK 安装的目标文件夹是文件或符号链接。
AlreadyRunning OK 另一个应用程序实例已在运行。

示例代码:

function Controller()
{
installer.autoRejectMessageBoxes;
installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);
installer.setMessageBoxAutomaticAnswer("stopProcessesForUpdates", QMessageBox.Ignore);
}

原创造福大家,共享改变世界

献出一片爱心,温暖作者心灵


Qt Installer Framework翻译(7-3)的更多相关文章

  1. Qt Installer Framework翻译(5-4)

    自定义安装程序 您可以使用脚本通过以下方式来自定义安装程序: > 添加Qt Installer Framework操作,该操作由脚本提供,并由安装程序执行. > 添加新页面,该页面由您在p ...

  2. Qt Installer Framework翻译(7-6)

    工具 Qt Installer Framework包含以下工具: > installerbase > binarycreator > repogen > archivegen ...

  3. Qt Installer Framework翻译(3-1)

    初始化安装 下图说明了安装应用程序的默认工作流程: 本节使用在macOS上运行的Your Application Installer示例来说明默认工作流程.安装程序具有本地化外观,并可感知每个受支持的 ...

  4. Qt Installer Framework翻译(1)

    IFW概览 Qt Installer Framework 提供了一组工具和程序来创建安装程序,并在不重写源代码的情况下将它们部署到所有受支持的桌面 Qt 平台上.安装程序具有本地化外观,并且可以感知运 ...

  5. Qt Installer Framework翻译(4)

    教程:创建安装程序 本教程描述如何为一个小项目创建一个简单的安装程序: 本节描述创建安装程序所必须完成的步骤: 创建一个包文件夹,其中将包含所有配置文件和可安装的包. 创建一个配置文件,其中包含有关如 ...

  6. Qt Installer Framework翻译(7-4)

    组件脚本 对于每个组件,您可以指定一个脚本,来准备要由安装程序执行的操作.脚本格式必须与QJSEngine兼容. 构造 脚本必须包含安装程序在加载脚本时创建的Component对象. 因此,脚本必须至 ...

  7. Qt Installer Framework翻译(7-8)

    C++ API C ++ API文档是为开发Qt Installer Framework的开发人员编写的. 它描述了内部API,因此没有兼容性保证. 此外,该文档尚在开发中,因此缺少部分内容,而其他部 ...

  8. Qt Installer Framework翻译(0)

    本人主攻C++和Qt. 以前一直看人家的博客,找资料学习.今天我也终于开博客啦. 最近在研究Qt install framework(IFW)应用程序安装框架. google也没发现有正儿八经的官方文 ...

  9. Qt Installer Framework翻译(7-2)

    包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...

随机推荐

  1. vue-learning:23 - js - leftcycle hooks

    vue 生命周期钩子函数 每一个Vue实例在创建时都需要经过一系列初始化.根据vue实例化过程中执行的逻辑,可以分为5个阶段: 初始化阶段 模板编译阶段 虚拟DOM挂载阶段 响应更新阶段 卸载阶段 这 ...

  2. swiper 使用参考 禁止手动滑动 监听事件

    最外层容器加类名  swiper-no-swiping 监听切换事件 onTransitionEnd: function(swiper){ console.log('过渡结束'); }

  3. dotnet 数组自动转基类数组提示 Co-variant array conversion 是什么问题

    在 C# 的语法,可以提供自动将某个类的数组自动转这个类的基类数组的方法,但是这样的转换在 Resharper 会提示 Co-variant array conversion 这是什么问题? 在 C# ...

  4. tensorflow学习笔记——ResNet

    自2012年AlexNet提出以来,图像分类.目标检测等一系列领域都被卷积神经网络CNN统治着.接下来的时间里,人们不断设计新的深度学习网络模型来获得更好的训练效果.一般而言,许多网络结构的改进(例如 ...

  5. docker运行容器后agetty进程cpu占用率100%

    1.最近在使用docker容器的时候,发现宿主机的agetty进程cpu占用率达到100% 在Google上搜了下,引起这个问题的原因是在使用"docker run"运行容器时使用 ...

  6. Qt configure 参数说明(中文)

    Qt configure 在编译QT前,可加各种参数来定制自己想要的QT库.这对需要裁减QT库的朋友来说非常重要.对于如何编译QT,可以参考:http://hi.baidu.com/agassi%5F ...

  7. .NET 半天搭建Jenkins持续集成与自动化部署系统

    前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...

  8. 002使用eop来烧写程序

  9. 网络状态诊断工具——netstat命令

    netstat命令可以用来查询整个系统的网络状态.百度百科的定义如下: Netstat的定义是: Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进 ...

  10. $Poj2054\ Color\ a\ Tree\ $ 贪心

    $poj$ $Description$ 一颗树有 $n$ 个节点,这些节点被标号为:$1,2,3…n,$每个节点 $i$ 都有一个权值 $A[i]$. 现在要把这棵树的节点全部染色,染色的规则是: 根 ...