组件脚本

对于每个组件,您可以指定一个脚本,该脚本准备由安装程序执行的操作。脚本格式必须与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

全局变量

安装程序将在脚本空间中将以下符号放入以下符号中

符号描述
installerQInstaller组件的引用
componentComponent的参考。

消息框

您可以使用以下静态成员在脚本中显示QMessageBox

为方便起见,通过QMessageBox.OkQMessageBox.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 上的 C:\Program Files,Linux 上的 /opt 和 macOS 上的 /Applications

另见列出 Windows 上应用程序目录示例的表格 应用程序目录

ApplicationsDirUser特定于用户的程序的应用程序目录。在 macOS 上很有用,在其他平台上与 ApplicationsDir 相同。

例如,macOS 上的 $HOME/Applications

ApplicationsDirX8632 位程序的应用程序目录。在 Windows 上很有用,在其他平台上与 ApplicationsDir 相同。

例如,Windows 上的 C:\Program Files (x86)

另见列出 Windows 上应用程序目录示例的表格 应用程序目录

ApplicationsDirX6464 位程序的应用程序目录。在 Windows 上很有用,在其他平台上与 ApplicationsDir 相同。

例如,Windows 上的 C:\Program Files

另见列出 Windows 上应用程序目录示例的表格 应用程序目录

InstallerDirPath包含安装程序应用程序可执行文件的目录。
InstallerFilePath安装程序应用程序可执行文件的文件路径。
UserStartMenuProgramsPath包含用户启动菜单项的文件夹的路径。

例如,C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

仅在 Windows 系统上可用。

AllUsersStartMenuProgramsPath包含所有用户启动菜单项的文件夹的路径。

例如,C:\ProgramData\Microsoft\Windows\Start Menu\Programs

仅在 Windows 系统上可用。

UILanguage安装程序使用的语言。

变量可以通过调用installer::value()来解决。如果嵌入在'@'符号中,它们也可以是安装操作传递给字符串参数的部分

if (installer.value("os") === "win") {
    component.addOperation("CreateShortcut", "@TargetDir@/MyApp.exe", "@StartMenuDir@/MyApp.lnk");
}

例如,Windows上的应用程序目录

操作系统 (Windows)Qt安装器框架变量示例路径
32位32位ApplicationsDirC:\Program Files
ApplicationsDirX86C:\Program Files
ApplicationsDirX64C:\Program Files
64位32位ApplicationsDirC:\Program Files (x86)
ApplicationsDirX86C:\Program Files (x86)
ApplicationsDirX64C:\Program Files
64位ApplicationsDirC:\Program Files
ApplicationsDirX86C:\Program Files (x86)
ApplicationsDirX64C:\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及其相应标识是芬兰以及其他全球国家的商标。所有其他商标均为其各自所有者的财产。