---
name: qt-installer-framework-config
description: Configure Qt Installer Framework for cross-platform installers with component management, online updates, and custom UI
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
tags: [qt, installer, deployment, distribution, packaging]
---
# qt-installer-framework-config
Configure Qt Installer Framework (IFW) for cross-platform installers. This skill generates installer configurations with component management, online updates, maintenance tool, and custom branding.
## Capabilities
- Generate installer configuration files
- Set up component structure with dependencies
- Configure online repository for updates
- Customize installer UI and branding
- Set up maintenance tool configuration
- Configure uninstaller behavior
- Generate component scripts
- Set up platform-specific settings
## Input Schema
```json
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Path to the project"
},
"installerName": {
"type": "string",
"description": "Name of the installer"
},
"appInfo": {
"type": "object",
"properties": {
"name": { "type": "string" },
"version": { "type": "string" },
"publisher": { "type": "string" },
"url": { "type": "string" }
},
"required": ["name", "version", "publisher"]
},
"components": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"displayName": { "type": "string" },
"description": { "type": "string" },
"version": { "type": "string" },
"required": { "type": "boolean" },
"dependencies": { "type": "array" }
}
}
},
"onlineRepository": {
"type": "object",
"properties": {
"enabled": { "type": "boolean" },
"url": { "type": "string" }
}
},
"targetPlatforms": {
"type": "array",
"items": { "enum": ["windows", "macos", "linux"] }
}
},
"required": ["projectPath", "installerName", "appInfo"]
}
```
## Output Schema
```json
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"structure": {
"type": "object",
"properties": {
"configDir": { "type": "string" },
"packagesDir": { "type": "string" }
}
},
"buildCommands": {
"type": "object",
"properties": {
"offline": { "type": "string" },
"online": { "type": "string" },
"repository": { "type": "string" }
}
}
},
"required": ["success"]
}
```
## Directory Structure
```
installer/
├── config/
│ ├── config.xml
│ ├── controller.qs
│ └── style.qss
├── packages/
│ ├── com.company.app/
│ │ ├── meta/
│ │ │ ├── package.xml
│ │ │ ├── installscript.qs
│ │ │ └── license.txt
│ │ └── data/
│ │ └── [application files]
│ └── com.company.app.plugins/
│ ├── meta/
│ │ └── package.xml
│ └── data/
│ └── [plugin files]
└── build/
└── [generated installer]
```
## Configuration Files
### config.xml
```xml
My Application
1.0.0
My Application Installer
My Company
My Application
@HomeDir@/MyApplication
Modern
style.qss
#2196F3
logo.png
watermark.png
banner.png
true
true
MaintenanceTool
https://updates.mycompany.com/repo
1
controller.qs
```
### package.xml
```xml
My Application
Main application component
1.0.0
2024-01-15
com.company.app
com.company.app.runtime
true
true
true
```
### installscript.qs
```javascript
function Component() {
// Constructor
}
Component.prototype.createOperations = function() {
component.createOperations();
if (systemInfo.productType === "windows") {
// Create Start Menu shortcut
component.addOperation("CreateShortcut",
"@TargetDir@/MyApp.exe",
"@StartMenuDir@/My Application.lnk",
"workingDirectory=@TargetDir@",
"iconPath=@TargetDir@/MyApp.exe",
"iconId=0",
"description=Launch My Application");
// Create Desktop shortcut
component.addOperation("CreateShortcut",
"@TargetDir@/MyApp.exe",
"@DesktopDir@/My Application.lnk");
// Register file association
component.addOperation("RegisterFileType",
"myapp",
"@TargetDir@/MyApp.exe '%1'",
"My Application File",
"text/x-myapp",
"@TargetDir@/MyApp.exe,0",
"ProgId=MyCompany.MyApp");
}
if (systemInfo.productType === "osx") {
// macOS specific operations
component.addOperation("Execute",
"/bin/ln", "-s",
"@TargetDir@/MyApp.app",
"/Applications/MyApp.app");
}
if (systemInfo.productType === "linux") {
// Create .desktop file
component.addOperation("CreateDesktopEntry",
"@TargetDir@/myapp.desktop",
"Type=Application\n" +
"Name=My Application\n" +
"Exec=@TargetDir@/MyApp\n" +
"Icon=@TargetDir@/myapp.png\n" +
"Categories=Utility;");
}
}
```
### controller.qs
```javascript
function Controller() {
installer.autoRejectMessageBoxes();
installer.installationFinished.connect(this, Controller.prototype.installationFinishedPageCallback);
}
Controller.prototype.IntroductionPageCallback = function() {
// Skip intro page in unattended mode
if (installer.isUnattended()) {
gui.clickButton(buttons.NextButton);
}
}
Controller.prototype.TargetDirectoryPageCallback = function() {
// Set custom target directory
var widget = gui.currentPageWidget();
widget.TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/MyApp");
}
Controller.prototype.ComponentSelectionPageCallback = function() {
// Pre-select components
var widget = gui.currentPageWidget();
widget.selectAll();
}
Controller.prototype.LicenseAgreementPageCallback = function() {
gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
}
Controller.prototype.installationFinishedPageCallback = function() {
// Launch app after installation
if (installer.isInstaller() && installer.status === QInstaller.Success) {
var widget = gui.currentPageWidget();
if (widget.RunItCheckBox) {
widget.RunItCheckBox.setChecked(true);
}
}
}
```
## Build Commands
```bash
# Build offline installer
binarycreator -c config/config.xml -p packages MyAppInstaller
# Build online installer (small, downloads components)
binarycreator -c config/config.xml -p packages -n MyAppOnlineInstaller
# Create/update repository
repogen -p packages repository
# Update existing repository
repogen --update-new-components -p packages repository
```
## Online Update Repository
```bash
# Initial repository creation
repogen -p packages output/repository
# Upload to server
rsync -avz output/repository/ user@server:/var/www/updates/
# Update with new version
repogen --update-new-components -p packages output/repository
```
## Best Practices
1. **Version components independently**: Allow granular updates
2. **Use online repository**: Enable auto-updates
3. **Customize UI**: Match application branding
4. **Test on all platforms**: Verify installer behavior
5. **Sign installers**: Code sign for trust
6. **Include maintenance tool**: Allow updates/uninstall
## Related Skills
- `qt-cmake-project-generator` - Build system setup
- `auto-update-system` process - Update workflow
- `windows-authenticode-signer` - Windows signing
- `macos-notarization-workflow` - macOS notarization
## Related Agents
- `qt-cpp-specialist` - Qt expertise
- `release-manager` - Release workflow