2023年11月27日发(作者:)

QtQtIFW安装包制作总结-QtIFW安装脚本与语法

⽂章⽬录

⼀、引⾔

对于每个安装程序,可以指定与安装程序的UI或功能的某些部分交互的控制脚本。控制脚本可以向安装向导添加或删除页⾯、更改现有页

⾯、执⾏额外的检查,并通过模拟⽤户单击与UI交互。例如,允许⽆⼈值守的安装。

注意:脚本格式必须与QJSEngine兼容。

本节描述为实现这样的控制脚本⽽调⽤的函数。同时还概述安装程序页⾯和每个页⾯上可⽤的⼩部件,如按钮、单选按钮和⾏编辑。

⼆、编写控制脚本

⼀个脚本⾄少需要包含⼀个构造函数,如下:

function Controller()

{

}

下⾯例⼦展⽰了⼀个⾼级的脚本,它使⽤gui JavaScript全局对象⽅法在介绍页⾯上设置新的页⾯标题和欢迎信息,并⾃动单击⽬标⽬录页

⾯上的Next按钮:

function Controller()

{

}

Controller.prototype.IntroductionPageCallback = function()

{

var widget = gui.currentPageWidget(); //

得到当前的页⾯向导

if (widget != null) {

widget.title = "New title."; //

设置页⾯的标题

widget.MessageLabel.setText("New Message."); //

设置欢迎显⽰的⽂本

}

}

Controller.prototype.TargetDirectoryPageCallback = function()

{

gui.clickButton(buttons.NextButton); // “Next”

⾃动单击按钮

}

下表总结了可以在控制器和组件脚本中使⽤的全局JavaScript对象。

序号JavaScript对象描述

1QDesktopServices提供常⽤桌⾯环境的访问⽅法

2QFileDialog提供⼀个对话框,允许⽤户选择⽂件或⽬录

3QInstaller提供从Qt脚本访问安装程序状态和页⾯

4QMessageBox提供⼀个模态对话框,⽤于通知⽤户或向⽤户询问问题并接收答案

5buttons提供可在安装程序页⾯上使⽤的按钮

序号JavaScript对象描述

6component表⽰Qt脚本所属的当前组件

7console提供⽤于记录和调试的⽅法

8gui启⽤与安装程序UI的交互

9installer提供访问Qt安装程序框架的核⼼功能

10print提供与QtScript的兼容性

11systeminfo提供操作系统的信息

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

Introduction----------------------简介页⾯

TargetDirectory--------------------安装⽂件夹选择页⾯

ComponentSelection----------------组件选择页⾯

LicenseCheck ----------------------License选择页⾯

StartMenuSelection-----------------开始菜单快捷⽅式选择页⾯

ReadyForInstallation--------------准备安装提⽰页⾯

PerformInstallation---------------执⾏安装页⾯

InstallationFinished--------------安装完成提⽰页⾯

三、各个安装程序页⾯的交互

本节内容将描述可以实现的与安装程序页⾯和每个页⾯上可⽤的⼩部件交互的功能。

3-1Introduction页⾯

通过实现controller .prototype. introtionpagecallback()函数来与介绍页⾯上的⼩部件交互。

该向导中有两个按钮:

NextButton

CancelButton

Widgets详细描述

ErrorLabel显⽰错误消息。

MessageLabel显⽰⼀条消息。默认情况下,它显⽰“欢迎使⽤安装向导”消息。

InformationLabel显⽰进度信息。

Radio Buttons详细描述

PackageManagerRadioButton作为维护⼯具运⾏时,页⾯上显⽰的包管理器单选按钮。

UpdaterRadioButton作为维护⼯具运⾏时,页⾯上显⽰的更新程序单选按钮。

UninstallerRadioButton当作为维护⼯具运⾏时,页⾯上显⽰的卸载程序单选按钮。默认选中。

Progress Bar详细描述

InformationProgressBar获取远程包时显⽰的进度条。

Qt Core FeatureBrief Description

packageManagerCoreTypeChanged()

如果想在维修⼯具的类型发⽣变化时得到通知,必须连接此信号。Note: 只有当⽤户启动了所谓的⼆进制维护⼯

具(安装后)并在单选按钮之间切换时才会发出信号。

⽰例代码

function Controller()

{

var widget = gui.pageById(QInstaller.Introduction); // introduction

获取向导页⾯

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());

}

3-2License Agreement页⾯

通过实现eAgreementPageCallback()函数来与许可协议页⾯上的⼩部件交互。

页⾯中按钮:

NextButton

CancelButton

BackButton

Widgets详细描述

LicenseListWidget列出可⽤的license。

LicenseTextBrowser显⽰所选license⽂件的内容。

AcceptLicenseLabel显⽰接受许可证单选按钮旁边的⽂本。

RejectLicenseLabel显⽰拒绝许可证单选按钮旁边的⽂本。

Radio Buttons详细描述

AcceptLicenseRadioButton接受许可协议。

RejectLicenseRadioButton

拒绝许可协议。默认选中。

3-3Target Directory页⾯

通过实现DirectoryPageCallback()函数来与⽬标⽬录选择页⾯上的⼩部件交互。

页⾯中可⽤按钮:

NextButton

CancelButton

BackButton

Widgets详细描述

MessageLabel显⽰帮助信息

TargetDirectoryLineEdit显⽰安装⽬标⽬录的值。

WarningLabel显⽰⼀个警告。

3-4Component Selection页⾯

通过实现entSelectionPageCallback()函数来与组件选择页⾯上的⼩部件交互。

页⾯中按钮:

NextButton

CancelButton

BackButton

Methods详细信息

selectAll()如果可能,选择所有可⽤的包。

deselectAll()如果可能,取消选择所有可⽤的包。

selectDefault()将可⽤包的检查状态重置为初始状态。

selectComponent(id)选择带有id (string)的包。

deselectComponent(id)取消选择带有id (string)的包。

Controller.prototype.ComponentSelectionPageCallback = function()

{

var page = gui.pageWidgetByObjectName("ComponentSelectionPage");

//CategoryGroupBox

如果可见,选中其中⼀个复选框,并在选择任何组件之前单击获取按钮

var groupBox = gui.findChild(page, "CategoryGroupBox");

if (groupBox) {

console.log("groupBox found");

// findChild

第⼆个参数是复选框的显⽰名称

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");

}

//

现在可以从获取的类别中选择组件

}

3-5Start Menu Directory页⾯

过实现enuDirectoryPageCallback()函数来与准备安装页⾯上的⼩部件交互。

页⾯按钮:

NextButton

CancelButton

BackButton

Widgets详细描述

StartMenuPathLineEdit显⽰创建程序快捷⽅式的⽬录。

3-6)执⾏安装页⾯

通过实现mInstallationPageCallback()函数来与执⾏安装页⾯上的⼩部件交互。

页⾯按钮:

CommitButton

CancelButton

3-7)完成页⾯

通过实现edPageCallback()函数来与安装完成页⾯上的⼩部件交互。

页⾯按钮:

CommitButton

CancelButton

FinishButton

Widgets详细描述

MessageLabel显⽰帮助信息

RunItCheckBox⽂本字段,通知⽤户他们可以在安装过程结束后启动应⽤程序。

四、对于⾃定义页⾯的交互

⾃定义页⾯注册为Dynamic{ObjectName}是UI⽂件中设置的对象名称。因此,调⽤

ObjectName,其中

Dynamic${ObjectName}Callback()函数。⼩部件可以使⽤它们的对象名称(来⾃UI⽂件)来寻址。

例如:

function Component()

{

// SomePageWidget

在选择安装⽬录页⾯新增加⾃定义的页⾯

installer.addWizardPage(component, "SomePageWidget", QInstaller.TargetDirectory)

}

Component.prototype.DynamicSomePageWidgetCallback = function()

{

var page = gui.pageWidgetByObjectName("DynamicSomePageWidget");

page.myButton.click, //UImyButton

⽂件中的按钮

page.someFancyWidget.subWidget.setText("foobar")

}

Message Boxes

例如,在执⾏安装程序应⽤程序时,应⽤程序可能会显⽰⼀些发⽣错误时的消息框。当在最终⽤户的系统上运⾏应⽤程序时,但它可能会

破坏⾃动化测试套件。为了克服这个问题,Qt安装程序框架显⽰的所有消息框都可以通过特定的标识符确认。

Possible

Answers

Yes, NoOverwriteTargetDirectory确认使⽤已经存在的⽬录作为安装的⽬标⽬录。

OK, Retry,

Ignore

Retry, Ignore,

Cancel

Abort, OKAuthorizationError⽆法获得提升的权限。

Abort, IgnoreOperationDoesNotExistError尝试执⾏某个操作时发⽣错误,但该操作不存在。

OKisAutoDependOnError调⽤包脚本时发⽣错误。⽆法评估该包是否对其他包具有⾃动依赖关系。

OKisDefaultError调⽤包脚本时发⽣错误。⽆法评估默认情况下是否会安装该包。

Retry, CancelDownloadError从远程存储库下载存档散列时发⽣错误。最终⽤户可以选择“重试”再次尝试。

Identifier描述

installationError

执⾏安装时发⽣致命错误。

installationErrorWithRetry

执⾏安装时发⽣错误。最终⽤户可以选择“重试”再次尝试。

archiveDownloadErrorRetry, Cancel从远程存储库下载存档时发⽣错误。最终⽤户可以选择“重试”再次尝试。

Identifier描述

WriteErrorOK⽇志含义编写维护⼯具时出错。

ElevationErrorOK⽆法获得提升的权限。

unknownOK删除某个包时发⽣未知错误。

ErrorOK常规错误。

stopProcessesForUpdates

Installer_Needs_To_Be_Local_ErrorOK安装程序⼆进制⽂件是从⽹络位置启动的,但不⽀持通过⽹络安装。

TargetDirectoryInUseNo安装的⽬标⽬录已经包含⼀个安装。

WrongTargetDirectoryOK安装的⽬标⽬录是⼀个⽂件或符号链接。

AlreadyRunningOK另⼀个应⽤程序实例已经在运⾏。

Possible

Answers

Retry, Ignore,更新包时发⽣错误。在执⾏更新之前,需要退出某些正在运⾏的应⽤程序或进程。最终⽤户可以

Cancel选择“重试”,以便在停⽌后再次尝试。

⽰例代码

function Controller()

{

installer.autoRejectMessageBoxes;

installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);

installer.setMessageBoxAutomaticAnswer("stopProcessesForUpdates", QMessageBox.Ignore);

}

五、总结

安装脚本主要⽤于获取安装包⼏个向导页⾯的相关(运⾏环境参数,界⾯中⼩部件参数,操作系统环境参数等)。并提供了调试的机制和

⽅法。

可见,安装脚本语法与JavaScript可以说⼏乎⼀样。