注册文件扩展示例

使用组件脚本在 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.<扩展名>,在记事本中打开它。

文件

©2021 The Qt Company Ltd. 本文档中的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款进行许可的。Qt 公司、Qt 及其各自标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为各自所有者的财产。