Register File Extension Example | Qt Installer Framework Documentation 4.11.0

- Qt Installer Framework Documentation
- Tutorials and Examples
- Register File Extension Example
- Qt Installer Framework 4.11.0

# Register File Extension Example

Using a component script to register a filename extension on Windows.

Register File Extension illustrates how to register a file type on Windows. We use the `component.addOperation()` function with the `RegisterFileType` operation to register a randomly generated file type to be opened with Notepad.

## Configuring the Example Installer

The installer configuration file, config.xml, in the `config` directory specifies the text and default values used in the installer:

- The `<Name>` element sets the application name and adds it to the page name and introduction text.
- The `<Version>` element sets the application version number.
- The `<Title>` element sets the installer name and displays it on the title bar.
- The `<Publisher>` element sets the publisher of the software (as shown in the Windows Control Panel, for example).
- The `<StartMenuDir>` element sets the name of the default program group for the product in the Windows Start menu.
- The `<TargetDir>` element sets the default target directory location to be within the `IfwExamples` directory in the home directory of the current user (because it uses the pre-existing variable `,` @HomeDir@, as part of the value). For more information, see Predefined Variables.

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

## Creating the Example Package Information File

The installer package information file, package.xml, in the `meta` directory specifies the components that are available for installation:

- The `<DisplayName>` element sets the human-readable name of the component.
- The `<Description>` element sets the human-readable description of the component.
- The `<Version>` element sets the version number of the component.
- The `<ReleaseDate>` element sets the date of release for this component version.

- The `<Default>` element is set to `true` to preselect the component in the installer.
- The `<Script>` element specifies the file name of the JavaScript file that is loaded to perform operations.
- The `<UserInterfaces>` element specifies the file names of the installer pages (.ui files) to use.

     <?xml version="1.0" encoding="UTF-8"?>
     <Package>
         <DisplayName>Register a file extension</DisplayName>
         <Description>Register a randomly generated file extension to open with notepad.exe</Description>
         <Version>1.0.0-1</Version>
         <ReleaseDate>2013-01-01</ReleaseDate>
         <Default>true</Default>
         <Script>installscript.qs</Script>
         <UserInterfaces>
             <UserInterface>registerfilecheckboxform.ui</UserInterface>
             <UserInterface>openfilecheckboxform.ui</UserInterface>
         </UserInterfaces>
     </Package>

## Registering File Extensions

In installscript.qs, we call the `Component()` function to connect to the `addRegisterFileCheckBox` signal as soon as all components have been loaded:

     function Component()
     {
         component.loaded.connect(this, addRegisterFileCheckBox);

We use the `addRegisterFileCheckBox()` function to display a check box for registering the generated file type on the last page of the installer. We hide the page when updating and uninstalling:

     addRegisterFileCheckBox = function()
         if (installer.isInstaller()) {
             if (installer.addWizardPageItem(component, "RegisterFileCheckBoxForm", QInstaller.TargetDirectory)) {
                 component.userInterface("RegisterFileCheckBoxForm").RegisterFileCheckBox.text =
                     component.userInterface("RegisterFileCheckBoxForm").RegisterFileCheckBox.text + component.unusualFileType;
             }
         }
     }

We connect to the `openRegisteredFileIfChecked` signal when end users select Finish on the last installer page:

         installer.finishButtonClicked.connect(this, openRegisteredFileIfChecked);

We call the `openRegisteredFileIfChecked` function to check that the file type was successfully registered:

     openRegisteredFileIfChecked = function()
     {
         if (!component.installed)
             return;

         if (installer.value("os") == "win" && installer.isInstaller() && installer.status == QInstaller.Success) {
             var isOpenRegisteredFileChecked = component.userInterface("OpenFileCheckBoxForm").OpenRegisteredFileCheckBox.checked;
             if (isOpenRegisteredFileChecked) {
                 QDesktopServices.openUrl("file:///" + component.fileWithRegisteredType);
             }
         }
     }

We bind the `unusualFileType` variable to the `generateUnusualFileType()` function that randomly generates a file type with the specified length:

         component.unusualFileType = generateUnusualFileType(5)
     }

     generateUnusualFileType = function(length)
     {
         var randomString = "";
         var possible = "abcdefghijklmnopqrstuvwxyz0123456789";

         for (var i = 0; i < length; i++)
             randomString += possible.charAt(Math.floor(Math.random() * possible.length));
         return randomString;
     }

We use the `RegisterFileType` operation to create a file of the specified type and to specify the application to open the file with:

         component.createOperations();

         if (component.userInterface("RegisterFileCheckBoxForm")) {
             var isRegisterFileChecked = component.userInterface("RegisterFileCheckBoxForm").RegisterFileCheckBox.checked;
         }
         if (installer.value("os") === "win") {
             var iconId = 0;
             var notepadPath = installer.environmentVariable("SystemRoot") + "\\notepad.exe";
             component.addOperation("RegisterFileType",
                                    component.unusualFileType,
                                    notepadPath + " '%1'",
                                    "QInstaller Framework example file type",
                                    "text/plain",
                                    notepadPath + "," + iconId,
                                    "ProgId=QtProject.QtInstallerFramework." + component.unusualFileType);
         }
         component.fileWithRegisteredType = installer.value("TargetDir") + "/registeredfile." + component.unusualFileType
         component.addOperation("Move", "@TargetDir@/registeredfile", component.fileWithRegisteredType);
     }

## Generating the Example Installer

To create the example installer, switch to the example source directory on the command line and enter the following command:

- On Windows:

       ..\..\bin\binarycreator.exe -c config\config.xml -p packages installer.exe

- On Linux or macOS:

       ../../bin/binarycreator -c config/config.xml -p packages installer

This creates the installer to the current directory.

After running the installer, double-click the installed file, `registeredfile.<extension>`, to open it in Notepad.

Files:

- registerfileextension/config/config.xml
- registerfileextension/packages/org.qtproject.ifw.example.registerfileextension/meta/installscript.qs
- registerfileextension/packages/org.qtproject.ifw.example.registerfileextension/meta/openfilecheckboxform.ui
- registerfileextension/packages/org.qtproject.ifw.example.registerfileextension/meta/package.xml
- registerfileextension/packages/org.qtproject.ifw.example.registerfileextension/meta/registerfilecheckboxform.ui
- registerfileextension/registerfileextension.pro