Component Error Example

Component Error demonstrates how to stop the installation and display error messages if one or several components cannot be installed.


  <?xml version="1.0" encoding="UTF-8"?>
  <Installer>
      <Name>Component Error Example</Name>
      <Version>1.0.0</Version>
      <Title>Component Error Example</Title>
      <Publisher>Qt-Project</Publisher>
      <StartMenuDir>Qt IFW Examples</StartMenuDir>
      <TargetDir>@HomeDir@/IfwExamples/componenterror</TargetDir>
  </Installer>

  • The <Script> element specifies the file name of the JavaScript file that is loaded to perform operations.

  <?xml version="1.0"?>
  <Package>
      <DisplayName>Root Component</DisplayName>
      <Description>This component handles the errors in the other components.</Description>
      <Version>1.0.1</Version>
      <ReleaseDate>2013-08-21</ReleaseDate>
      <Script>installscript.js</Script>
  </Package>

This example attempts to install three components, so we create a package.xml file in each component directory: root, root.component1, and root.component2 and specify the component name and description in each of them.

Stopping the Installation on Errors

In installscript.js in the root directory, we call the abortInstaller() function to hide all the default installer pages and to display an error message if the components contain errors:


  function abortInstaller()
  {
      installer.setDefaultPageVisible(QInstaller.Introduction, false);
      installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
      installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
      installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
      installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
      installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
      installer.setDefaultPageVisible(QInstaller.LicenseCheck, false);

      var abortText = "<font color='red' size=3>" + qsTr("Installation failed:") + "</font>";

      var error_list = installer.value("component_errors").split(";;;");
      abortText += "<ul>";
      // ignore the first empty one
      for (var i = 0; i < error_list.length; ++i) {
          if (error_list[i] !== "") {
              console.log(error_list[i]);
              abortText += "<li>" + error_list[i] + "</li>"
          }
      }
      abortText += "</ul>";
      installer.setValue("FinishedText", abortText);
  }

We use the reactOnAbortInstallerChange() signal to stop the installation if ComponentError is true:


  function reactOnAbortInstallerChange()
  {
      if (installer.value("ComponentError") === "true")
          abortInstaller();
  }

We use the Component() function to connect to the reactOnAbortInstallerChange() signal when the list of new root components has been updated:


  function Component()
  {
      installer.finishAllComponentsReset.connect(reactOnAbortInstallerChange);
  }

To open the page that displays the error message, we create fake errors by setting ComponentError to true in installscript.js in the root.component1 and root.component2 directories:


  function Component()
  {
      var error = true;
      if (error) {
          installer.setValue("component_errors", installer.value("component_errors") + ";;;"
              + "Error in component: " + component.name);
      }
      installer.setValue("ComponentError", true);
  }

Each component adds a message to the component_errors variable. In your app, the error variable should return the results of a real check for an existing file or system feature.

Files: