注册文件扩展示例
使用组件脚本在 Windows 上注册文件名扩展。

注册文件扩展 说明了如何在 Windows 上注册文件类型。我们使用 component.addOperation() 函数和 RegisterFileType 操作来注册一个随机生成的文件类型,以便使用记事本打开。
配置示例安装程序
在配置文件目录中的installer配置文件,config.xml指定了安装程序中使用的文本和默认值
- <Name>元素设置应用程序名称并将其添加到页面名称和简介文本中。
- <Version>元素设置应用程序版本号。
- <Title>元素设置安装程序名称并在标题栏中显示。
- <Publisher>元素设置软件的发布者(例如,在 Windows 控制面板中显示的)。
- <StartMenuDir>元素设置产品在 Windows 开始 菜单中的默认程序组名称。
- <TargetDir>元素将默认目标目录位置设置为当前用户主目录中的- IfwExamples目录内(因为它使用预先存在的变量- ,@HomeDir@,作为值的一部分)。有关更多信息,请参阅预定义变量。
<?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>创建示例包信息文件
在元文件目录中的install程序包信息文件 package.xml指定了可用于安装的组件
- <DisplayName>元素设置组件的易读名称。
- <Description>元素设置组件的易读描述。
- <Version>元素设置组件的版本号。
- <ReleaseDate>元素设置此组件版本的发布日期。
- <Default>元素设置为- true,以在安装程序中预选组件。
- <Script>元素指定执行操作的加载到操作中的JavaScript文件名称。
- <UserInterfaces>元素指定用于安装程序的安装页面(.ui文件)的文件名。
<?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>注册文件扩展
在installscript.qs中,我们在所有组件都已加载后调用 Component() 函数以连接到 addRegisterFileCheckBox 信号
function Component()
{
    component.loaded.connect(this, addRegisterFileCheckBox);我们使用 addRegisterFileCheckBox() 函数在安装程序的最后一页显示用于注册生成的文件类型的复选框。在更新和卸载时隐藏此页面
addRegisterFileCheckBox = function()
    if (installer.isInstaller()) {
        if (installer.addWizardPageItem(component, "RegisterFileCheckBoxForm", QInstaller.TargetDirectory)) {
            component.userInterface("RegisterFileCheckBoxForm").RegisterFileCheckBox.text =
                component.userInterface("RegisterFileCheckBoxForm").RegisterFileCheckBox.text + component.unusualFileType;
        }
    }
}在最终用户选择最后一页上的 完成 时,我们连接到 openRegisteredFileIfChecked 信号
installer.finishButtonClicked.connect(this, openRegisteredFileIfChecked);
我们调用 openRegisteredFileIfChecked 函数以检查文件类型是否成功注册
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);
        }
    }
}我们将 unusualFileType 变量绑定到 generateUnusualFileType() 函数,该函数随机生成指定长度的文件类型
    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;
}我们使用 RegisterFileType 操作创建指定类型的文件,并指定打开文件的应用程序
    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);
}生成示例安装程序
要创建示例安装程序,请切换到命令行中的示例源目录,并输入以下命令
- 在 Windows 上..\..\bin\binarycreator.exe -c config\config.xml -p packages installer.exe 
- 在 Linux 或 macOS 上../../bin/binarycreator -c config/config.xml -p packages installer 
这将创建当前目录的安装程序。
运行安装程序后,双击已安装文件,registeredfile.<扩展名>,在记事本中打开它。
文件
- 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
©2021 The Qt Company Ltd. 本文档中的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款进行许可的。Qt 公司、Qt 及其各自标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为各自所有者的财产。