组件脚本
对于每个组件,您可以指定一个脚本,该脚本准备由安装程序执行的操作。脚本格式必须与QJSEngine兼容。
构建
该脚本必须包含一个 Install er
对象,当安装程序加载脚本时创建。因此,该脚本至少必须包含执行初始化的Component()
函数,例如,将页面放入正确的位置或连接信号和槽。
以下代码片段将ErrorPage
(来自errorpage.ui的用户界面文件的类名)放置在就绪安装页面前,并将其完整性设置为false
。
function Component() { // Add a user interface file called ErrorPage, which should not be complete installer.addWizardPage( component, "ErrorPage", QInstaller.ReadyForInstallation ); component.userInterface( "ErrorPage" ).complete = false; }
有关更多信息,请参阅installer::addWizardPage()和component::userInterface的文档。
安装程序钩子
您可以将以下钩子方法添加到您的脚本中
方法 | 描述 |
---|---|
Component.prototype.retranslateUi | 当安装程序的语言更改时调用。 |
Component.prototype.createOperations | 请参阅component::createOperations。 |
Component.prototype.createOperationsForArchive | 请参阅component::createOperationsForArchive。 |
Component.prototype.createOperationsForPath | 请参阅component::createOperationsForPath。 |
全局变量
安装程序将在脚本空间中将以下符号放入以下符号中
符号 | 描述 |
---|---|
installer | QInstaller组件的引用 |
component | Component的参考。 |
消息框
您可以使用以下静态成员在脚本中显示QMessageBox
为方便起见,通过QMessageBox.Ok
、QMessageBox.Open
等提供了QMessageBox::StandardButton的值。
向组件添加操作
您可能希望在提取内容后、复制文件或修补文件内容等操作时添加自定义操作。您可以使用component::addOperation
()在脚本中创建和添加更新操作到安装程序。如果您需要运行需要管理员权限的操作,请改用component::addElevatedOperation
()。添加自定义操作的另一种方式是使用component.xml
,请参阅包目录。
必须在实际安装步骤之前添加操作。通过覆盖component::createOperations()来为组件注册自定义操作。
每个操作都有一个唯一的键用于标识,可以最多接受五个参数。在参数值中,你可以使用在 installer::setValue() 中设置的变量。更多信息请参阅 预定义变量。
有关所有可用操作的摘要,请参阅 操作。
注册自定义操作
您可以通过从 KDUpdater::UpdateOperation 类派生来在安装程序中注册自定义安装操作。以下代码显示了您必须实现的方法
#include <UpdateOperation> class CustomOperation : public KDUpdater::UpdateOperation { public: CustomOperation() { setName( "CustomOperation" ); setGroup( Install ); } void backup() { // do whatever is needed to restore the state in undoOperation() } bool performOperation() { const QStringList args = arguments(); // do whatever is needed to do for the given arguments bool success = ...; return success; } void undoOperation() { // restore the previous state, as saved in backup() } bool testOperation() { // currently unused return true; } CustomOperation* clone() const { return new CustomOperation; } QDomDocument toXml() { // automatically adds the operation's arguments and everything set via setValue QDomDocument doc = KDUpdater::UpdateOperation::toXml(); // if you need any information to undo the operation you did, // add them to the doc here return doc; } bool fromXml( const QDomDocument& doc ) { // automatically loads the operation's arguments and everything set via setValue if( !KDUpdater::UpdateOperation::fromXml( doc ) ) return false; // if you need any information to undo the operation you did, // read them from the doc here return true; } };
最后,您需要按照以下方式注册您自定义的操作类
#include <UpdateOperationFactory> KDUpdater::UpdateOperationFactory::instance().registerUpdateOperation< CustomOperation >( "CustomOperation" );
现在您可以在安装程序中使用此操作,就像使用预定义操作一样。
预定义变量
您可以在脚本中使用以下预定义变量来方便地访问目录
符号 | 描述 |
---|---|
ProductName | 要安装的产品的名称,如 config.xml 中定义。 |
ProductVersion | 要安装的产品的版本号,如 config.xml 中定义。 |
Title | 安装程序的标题,如 config.xml 中定义。 |
Publisher | 安装程序的出版商,如 config.xml 中定义。 |
Url | 产品 URL,如 config.xml 中定义。 |
StartMenuDir | 在 config.xml 中定义的启动菜单组。仅在 Windows 系统上可用。 |
TargetDir | 由用户选择的安装目标目录。 |
DesktopDir | 包含用户桌面目录的名称。 仅在 Windows 系统上可用。 |
os | 当前平台: "x11" ,"win" 或 "mac" 。此变量已过时:请使用 systemInfo 代替。 |
FrameworkVersion | 用于构建安装程序的 Qt Installer Framework 的版本号。 |
RootDir | 文件系统的根目录。 |
HomeDir | 当前用户的家目录。 |
ApplicationsDir | 应用程序目录。 例如,Windows 上的 另见列出 Windows 上应用程序目录示例的表格 应用程序目录。 |
ApplicationsDirUser | 特定于用户的程序的应用程序目录。在 macOS 上很有用,在其他平台上与 ApplicationsDir 相同。例如,macOS 上的 |
ApplicationsDirX86 | 32 位程序的应用程序目录。在 Windows 上很有用,在其他平台上与 ApplicationsDir 相同。例如,Windows 上的 另见列出 Windows 上应用程序目录示例的表格 应用程序目录。 |
ApplicationsDirX64 | 64 位程序的应用程序目录。在 Windows 上很有用,在其他平台上与 ApplicationsDir 相同。例如,Windows 上的 另见列出 Windows 上应用程序目录示例的表格 应用程序目录。 |
InstallerDirPath | 包含安装程序应用程序可执行文件的目录。 |
InstallerFilePath | 安装程序应用程序可执行文件的文件路径。 |
UserStartMenuProgramsPath | 包含用户启动菜单项的文件夹的路径。 例如, 仅在 Windows 系统上可用。 |
AllUsersStartMenuProgramsPath | 包含所有用户启动菜单项的文件夹的路径。 例如, 仅在 Windows 系统上可用。 |
UILanguage | 安装程序使用的语言。 |
变量可以通过调用installer::value()来解决。如果嵌入在'@'符号中,它们也可以是安装操作传递给字符串参数的部分
if (installer.value("os") === "win") { component.addOperation("CreateShortcut", "@TargetDir@/MyApp.exe", "@StartMenuDir@/MyApp.lnk"); }
例如,Windows上的应用程序目录
操作系统 (Windows) | Qt安装器框架 | 变量 | 示例路径 |
---|---|---|---|
32位 | 32位 | ApplicationsDir | C:\Program Files |
ApplicationsDirX86 | C:\Program Files | ||
ApplicationsDirX64 | C:\Program Files | ||
64位 | 32位 | ApplicationsDir | C:\Program Files (x86) |
ApplicationsDirX86 | C:\Program Files (x86) | ||
ApplicationsDirX64 | C:\Program Files | ||
64位 | ApplicationsDir | C:\Program Files | |
ApplicationsDirX86 | C:\Program Files (x86) | ||
ApplicationsDirX64 | C:\Program Files |
在组件脚本中使用postLoad
默认情况下,组件脚本在安装树视图显示之前被评估。如果有大量具有组件脚本的组件,这可能会导致性能开销。《code translate="no">postLoad属性引入了一种在启动安装之前评估组件脚本的方法,仅适用于选择安装或更新的组件
<Script postLoad="true">my_install_script.qs</Script>
是否可以将postLoad
设置为true
需要根据脚本内容逐案考虑。例如,如果脚本内容会影响安装树视图,如将<默认值>
设置为true
,设置新的依赖项或添加新的向导页面,则不应使用postLoad
或必须将其设置为false
。如果脚本仅包含在安装期间运行的函数,则可以将postLoad
设置为true
。例如,所有重写的operation
函数都在安装期间运行。有关更多信息,请参阅向组件添加操作。如果您不确定何时使用postLoad
,则不要使用它。仅当有数千个脚本来评估时,性能开销才是巨大的。
可以同时使用<Script postLoad="true">
和<Script>
标签。这意味着一个组件可以有一个在安装开始时评估的脚本,另一个在安装树视图显示之前评估的脚本。
©2021 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可版1.3的条款许可的。Qt公司和Qt及其相应标识是芬兰以及其他全球国家的商标。所有其他商标均为其各自所有者的财产。