Qt Installer Framework翻译(7-3)
控制脚本
对于每个安装程序,您可以指定一个控制脚本,用来与安装程序的部分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)的更多相关文章
- Qt Installer Framework翻译(5-4)
自定义安装程序 您可以使用脚本通过以下方式来自定义安装程序: > 添加Qt Installer Framework操作,该操作由脚本提供,并由安装程序执行. > 添加新页面,该页面由您在p ...
- Qt Installer Framework翻译(7-6)
工具 Qt Installer Framework包含以下工具: > installerbase > binarycreator > repogen > archivegen ...
- Qt Installer Framework翻译(3-1)
初始化安装 下图说明了安装应用程序的默认工作流程: 本节使用在macOS上运行的Your Application Installer示例来说明默认工作流程.安装程序具有本地化外观,并可感知每个受支持的 ...
- Qt Installer Framework翻译(1)
IFW概览 Qt Installer Framework 提供了一组工具和程序来创建安装程序,并在不重写源代码的情况下将它们部署到所有受支持的桌面 Qt 平台上.安装程序具有本地化外观,并且可以感知运 ...
- Qt Installer Framework翻译(4)
教程:创建安装程序 本教程描述如何为一个小项目创建一个简单的安装程序: 本节描述创建安装程序所必须完成的步骤: 创建一个包文件夹,其中将包含所有配置文件和可安装的包. 创建一个配置文件,其中包含有关如 ...
- Qt Installer Framework翻译(7-4)
组件脚本 对于每个组件,您可以指定一个脚本,来准备要由安装程序执行的操作.脚本格式必须与QJSEngine兼容. 构造 脚本必须包含安装程序在加载脚本时创建的Component对象. 因此,脚本必须至 ...
- Qt Installer Framework翻译(7-8)
C++ API C ++ API文档是为开发Qt Installer Framework的开发人员编写的. 它描述了内部API,因此没有兼容性保证. 此外,该文档尚在开发中,因此缺少部分内容,而其他部 ...
- Qt Installer Framework翻译(0)
本人主攻C++和Qt. 以前一直看人家的博客,找资料学习.今天我也终于开博客啦. 最近在研究Qt install framework(IFW)应用程序安装框架. google也没发现有正儿八经的官方文 ...
- Qt Installer Framework翻译(7-2)
包文件夹 安装程序包含的组件,要么是内嵌的,要么可以从远程存储库加载.在这两种情况下,都需要为组件使用一种安装程序可以读取的文件格式和结构. 包文件夹结构 将所有组件放在相同的根文件夹中,即包文件夹. ...
随机推荐
- C# 文件在数据库 的 存取
... /// <summary> /// 获取数据库Image字段数据,保存到本地 /// </summary> /// <param name="sende ...
- TOJ4587:抓苹果(DP)
传送门:抓苹果 dp(i,j) = max(dp(i-1,j-1),dp(i-1,j))+当i这分钟时能否刚好移动到这棵树下. 初始化是对不移动的情况下. 代码 #include<bits/st ...
- TransactionDefinition接口中定义了七个事务传播行为
1.PROPAGATION_REQUIRED如果存在一个事务,则支持当前事务,如果没有事务则开启一个新的事务.使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在 ...
- 【NOIP数据结构专项】单调队列单调栈
[FZYZ P1280 ][NOIP福建夏令营]矩形覆盖 Description 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],求最少需要几个矩形才能覆盖这个图形. ...
- 一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式
前言 有时候我们需要在应用启动时执行一些代码片段,这些片段可能是仅仅是为了记录 log,也可能是在启动时检查与安装证书 ,诸如上述业务要求我们可能会经常碰到 Spring Boot 提供了至少 5 种 ...
- Jenkins的简单安装
系统:CentOS release 6.5 (Final) 一. 安装JDK 1.1 查询系统是否已安装OpenJDK Centos系统默认会安装OpenJDK,首先检查系统是否安装有jdk并且是Op ...
- TypeScript躬行记(8)——装饰器
装饰器(Decorator)可声明在类及其成员(例如属性.方法等)之上,为它们提供一种标注,用于分离复杂逻辑或附加额外逻辑,其语法形式为@expression.expression是一个会在运行时被调 ...
- mongodb安装及安装MongoDB报错Verify that you have sufficient privileges to start system services解决方法
1.点击安装包mongodb-win32-x86_64-2012plus-4.2.2-signed进行安装 2.点击next 3.接受协议,点击next 4.点击自定义安装 选择安装路径,建议默认C盘 ...
- $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对
$Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...
- HDU4352 XHXJ's LIS 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 题目大意: 求区间 \([L,R]\) 范围内最长上升子序列(Longest increasin ...