【问题标题】:Silent install Qt55 Enterprise on Windows在 Windows 上静默安装 Qt55 Enterprise
【发布时间】:2016-06-14 15:03:20
【问题描述】:

编辑:在 Qt 支持的帮助下,我已经解决了如何自动化 Qt 企业安装程序的这两个部分。下面是脚本调用。

我正在尝试在 Windows 8.1 和 Windows 10 上静默安装 Qt 5.5.1 Enterprise,使用“--script”开关调用自动化 UI 的 javascript,但似乎无法读取其中的所有元素读取它的 UI。

我有 2 个控制器页面,它们的工作方式与标准 Qt 安装程序不同,特别是“CredentialsPageCallback”,它需要在调用“gui.clickButton(buttons.NextButton);”之前选中一个复选框; 它还支持一个名为“ManualLicensePageCallback”的新回调页面,该页面根本没有任何文档。 这是我正在编写的脚本。我需要凭据页面上的复选框名称,以及手动页面上的两个“行编辑”调用:

// Emacs mode hint: -*- mode: JavaScript -*-

function Controller() {
    //installer.autoRejectMessageBoxes();
    installer.installationFinished.connect(function() {
    gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.pageWidgetByObjectName("CredentialsPage").enterManuallyCheckBox.click();
    gui.clickButton(buttons.NextButton);    
}

Controller.prototype.ManualLicensePageCallback = function() {
    var page = gui.pageWidgetByObjectName("ManualLicensePage");
    page.LicenseeLineEdit.setText("NAME");
    page.Qt5KeyLineEdit.setText("REG KEY");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function() {
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("C:\\Path\\To\\Install");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    //BY DEFAULT, THE DEFAULT INSTALL METHOD IS SELECTED
    //USE THESE WIDGET CALLS TO DESELECT ANY  ITEMS

    //widget.deselectAll();
    //widget.deselectComponent("qt.55.win64_msvc2013_64");
    //widget.deselectComponent("qt.55.qt3d");
    //widget.deselectComponent("qt.55.qtquick1");
    //widget.deselectComponent("qt.55.qtwebengine");
    //widget.deselectComponent("qt.55.qtquickcontrols");
    //widget.deselectComponent("qt.55.qtscript");
    //widget.deselectComponent("qt.55.qtcanvas3d");
    //widget.deselectComponent("qt.55.qtlocation");

    //widget.deselectComponent("qt.tools");
    //widget.deselectComponent("qt.extras");
    //widget.deselectComponent("qt.enterpriseaddons");

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.FinishedPageCallback = function() {
    var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm
    if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
        checkBoxForm.launchQtCreatorCheckBox.checked = false;
    }
    gui.clickButton(buttons.FinishButton);
}

【问题讨论】:

  • 我发现 Qt 的安装程序比他们的价值更麻烦。如果您以任何专业的身份使用 Qt,您应该自己编译它;然后安装它只是简单地解压缩档案,并可能在 PATH 中添加一个元素。
  • 我同意,但我正在尝试执行的任务是使用安装 QT 的企业安装程序,并构建一个静默安装程序,以便开发人员可以毫无问题地启动新的开发机器。这包括在安装程序中使用我们的注册密钥和自动填充元素。对不起,如果我的问题不清楚。谢谢!
  • 一个 Qt “安装”,当它是预构建的时,相当于解压缩一个存档(如果你已经移动它,可以选择重新定位路径)。您可以选择将其添加到 PATH。从字面上看,没有其他事情可做。如果您愿意,您可以使用任何方式在您的机器上安装它(通过安装程序、重建等),然后简单地压缩并以这种方式部署。只要你在每台机器上部署到相同的路径,你就不需要做任何其他事情。让“安装程序”进一步重新分发这样的设置是多余的。
  • 有一些文档可用于查找 UI 元素,但并不全面。你可以去这里download.qt.io/online/qtsdkrepository 找到一个 Updates.XML 文件 -- 选择 platform->subplatform->qt->Updates.XML 它提到了一个 installscript.qs -- 如果有现有的安装脚本(可能在源) 你可能会在那里找到一些有用的东西。
  • Kuba Ober- 这对于 Qt 的标准安装非常有用,但对于企业版,许可证详细信息存储在哪里?我知道有一些存储在 C:\Users\\AppData\Roaming\Qt 中,但我相信 if 还设置了一个注册表项,这就是我们尝试自动化安装程序而不是打包解压缩安装和复制的原因它到另一台机器。感谢您的意见。

标签: javascript qt installation


【解决方案1】:

在 5.8 安装中搜索 XML 文件时,我在名为 components.xml 的文件中找到了一个 Windows 标签值。在查看完所有内容后,看起来该文件是由您在安装时选择生成的。因此,我对最新发布的 Qt (5.9.0) 进行了完整安装,但 Source 除外,在尝试了其中一些之后,我知道组件标签是 "qt.59.src"

关于获得这些的直接 UI 元素检查,我尝试了 gui-inspect-tool repo 中的所有 UI 检查工具,但没有一个成功。 UISpy.exe 提供的信息最多,但相当不稳定。看起来 Qt 没有将其组件名称传播到“名称”字段,以便与 WinAPI 和本机 Windows UI 检查器一起使用。所有“名称”字段要么是空字符串,要么是所有 UI 检查工具返回的错误。

安装后,您可以在您的基础 qt 安装中打开 components.xml。

然后为整个文件搜索术语Prebuilt。每次点击都会将您带到一个描述字段,上面两行是您需要的名称字段。对于 5.9,我认为对于预构建的二进制文件有一个例外,那就是(已弃用)Qt 脚本。

这是 components.xml 中的一个包的示例:

<Package>
        <Name>qt.59.android_armv7</Name>
        <Title>Android ARMv7</Title>
        <Description>Qt 5.9.0 Prebuilt Components for Android ARMv7</Description>
        <Version>5.9.0-0</Version>
        <LastUpdateDate></LastUpdateDate>
        <InstallDate>2017-06-16</InstallDate>
        <Size>145381493</Size>
        <Dependencies>qt.tools.qtcreator,qt.59.doc,qt.59.examples,qt.tools.win32_mingw530</Dependencies>
        <Checkable>true</Checkable>
    </Package>

qt.59.android_armv7 中的 &lt;Name&gt; 是用于 QS 文件的实际组件字符串,例如,

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.selectAll();

    widget.deselectComponent("qt.59.android_armv7");

    gui.clickButton(buttons.NextButton);
}

为了节省一些可能正在使用 5.9 或具有类似结构的安装程序的人的时间,以下是不同预构建平台的所有标签名称:

Android ARMv7:"qt.59.android_armv7"
安卓 x86:"qt.59.android_x86"
MinGW 5.3.0 32 位:"qt.59.win32_mingw53"
msvc2017 64 位:"qt.59.win64_msvc2017_64"
msvc2015 32 位:"qt.59.win32_msvc2015"
msvc2015 64 位:"qt.59.win64_msvc2015_64"
msvc2013 64 位:"qt.59.win64_msvc2013_64"
UWP x64 (MSVC2015):"qt.59.win64_msvc2015_winrt_x64"
UWP x64 (MSVC2017):"qt.59.win64_msvc2017_winrt_x64"
UWP x86 (MSVC2015):"qt.59.win64_msvc2015_winrt_x86"
UWP x86 (MSVC2017):"qt.59.win64_msvc2017_winrt_x86"
UWP armv7 (MSVC2015):"qt.59.win64_msvc2015_winrt_armv7"
UWP armv7 (MSVC2017): "qt.59.win64_msvc2017_winrt_armv7"

作为进一步的礼貌,这里是所有组件的转储。其中一些实际上是您选择的组件的依赖项,因此您的里程会有所不同:

"qt"
"qt.59"
"qt.59.android_armv7"
"qt.59.android_x86"
"qt.59.doc"
"qt.59.doc.qtcharts"
"qt.59.doc.qtdatavis3d"
"qt.59.doc.qtnetworkauth"
"qt.59.doc.qtpurchasing"
"qt.59.doc.qtremoteobjects"
"qt.59.doc.qtscript"
"qt.59.doc.qtspeech"
"qt.59.doc.qtvirtualkeyboard"
"qt.59.doc.qtwebengine"
"qt.59.examples"
"qt.59.examples.qtcharts"
"qt.59.examples.qtdatavis3d"
"qt.59.examples.qtnetworkauth"
"qt.59.examples.qtpurchasing"
"qt.59.examples.qtremoteobjects"
"qt.59.examples.qtscript"
"qt.59.examples.qtspeech"
"qt.59.examples.qtvirtualkeyboard"
"qt.59.examples.qtwebengine"
"qt.59.qtcharts"
"qt.59.qtcharts.android_armv7"
"qt.59.qtcharts.android_x86"
"qt.59.qtcharts.win32_mingw53"
"qt.59.qtcharts.win32_msvc2015"
"qt.59.qtcharts.win64_msvc2013_64"
"qt.59.qtcharts.win64_msvc2015_64"
"qt.59.qtcharts.win64_msvc2015_winrt_armv7"
"qt.59.qtcharts.win64_msvc2015_winrt_x64"
"qt.59.qtcharts.win64_msvc2015_winrt_x86"
"qt.59.qtcharts.win64_msvc2017_64"
"qt.59.qtcharts.win64_msvc2017_winrt_armv7"
"qt.59.qtcharts.win64_msvc2017_winrt_x64"
"qt.59.qtcharts.win64_msvc2017_winrt_x86"
"qt.59.qtdatavis3d"
"qt.59.qtdatavis3d.android_armv7"
"qt.59.qtdatavis3d.android_x86"
"qt.59.qtdatavis3d.win32_mingw53"
"qt.59.qtdatavis3d.win32_msvc2015"
"qt.59.qtdatavis3d.win64_msvc2013_64"
"qt.59.qtdatavis3d.win64_msvc2015_64"
"qt.59.qtdatavis3d.win64_msvc2015_winrt_armv7"
"qt.59.qtdatavis3d.win64_msvc2015_winrt_x64"
"qt.59.qtdatavis3d.win64_msvc2015_winrt_x86"
"qt.59.qtdatavis3d.win64_msvc2017_64"
"qt.59.qtdatavis3d.win64_msvc2017_winrt_armv7"
"qt.59.qtdatavis3d.win64_msvc2017_winrt_x64"
"qt.59.qtdatavis3d.win64_msvc2017_winrt_x86"
"qt.59.qtnetworkauth"
"qt.59.qtnetworkauth.android_armv7"
"qt.59.qtnetworkauth.android_x86"
"qt.59.qtnetworkauth.win32_mingw53"
"qt.59.qtnetworkauth.win32_msvc2015"
"qt.59.qtnetworkauth.win64_msvc2013_64"
"qt.59.qtnetworkauth.win64_msvc2015_64"
"qt.59.qtnetworkauth.win64_msvc2015_winrt_armv7"
"qt.59.qtnetworkauth.win64_msvc2015_winrt_x64"
"qt.59.qtnetworkauth.win64_msvc2015_winrt_x86"
"qt.59.qtnetworkauth.win64_msvc2017_64"
"qt.59.qtnetworkauth.win64_msvc2017_winrt_armv7"
"qt.59.qtnetworkauth.win64_msvc2017_winrt_x64"
"qt.59.qtnetworkauth.win64_msvc2017_winrt_x86"
"qt.59.qtpurchasing"
"qt.59.qtpurchasing.android_armv7"
"qt.59.qtpurchasing.android_x86"
"qt.59.qtpurchasing.win32_mingw53"
"qt.59.qtpurchasing.win32_msvc2015"
"qt.59.qtpurchasing.win64_msvc2013_64"
"qt.59.qtpurchasing.win64_msvc2015_64"
"qt.59.qtpurchasing.win64_msvc2015_winrt_armv7"
"qt.59.qtpurchasing.win64_msvc2015_winrt_x64"
"qt.59.qtpurchasing.win64_msvc2015_winrt_x86"
"qt.59.qtpurchasing.win64_msvc2017_64"
"qt.59.qtpurchasing.win64_msvc2017_winrt_armv7"
"qt.59.qtpurchasing.win64_msvc2017_winrt_x64"
"qt.59.qtpurchasing.win64_msvc2017_winrt_x86"
"qt.59.qtremoteobjects"
"qt.59.qtremoteobjects.android_armv7"
"qt.59.qtremoteobjects.android_x86"
"qt.59.qtremoteobjects.win32_mingw53"
"qt.59.qtremoteobjects.win32_msvc2015"
"qt.59.qtremoteobjects.win64_msvc2013_64"
"qt.59.qtremoteobjects.win64_msvc2015_64"
"qt.59.qtremoteobjects.win64_msvc2015_winrt_armv7"
"qt.59.qtremoteobjects.win64_msvc2015_winrt_x64"
"qt.59.qtremoteobjects.win64_msvc2015_winrt_x86"
"qt.59.qtremoteobjects.win64_msvc2017_64"
"qt.59.qtremoteobjects.win64_msvc2017_winrt_armv7"
"qt.59.qtremoteobjects.win64_msvc2017_winrt_x64"
"qt.59.qtremoteobjects.win64_msvc2017_winrt_x86"
"qt.59.qtscript"
"qt.59.qtscript.android_armv7"
"qt.59.qtscript.android_x86"
"qt.59.qtscript.win32_mingw53"
"qt.59.qtscript.win32_msvc2015"
"qt.59.qtscript.win64_msvc2013_64"
"qt.59.qtscript.win64_msvc2015_64"
"qt.59.qtscript.win64_msvc2017_64"
"qt.59.qtspeech"
"qt.59.qtspeech.android_armv7"
"qt.59.qtspeech.android_x86"
"qt.59.qtspeech.win32_mingw53"
"qt.59.qtspeech.win32_msvc2015"
"qt.59.qtspeech.win64_msvc2013_64"
"qt.59.qtspeech.win64_msvc2015_64"
"qt.59.qtspeech.win64_msvc2017_64"
"qt.59.qtvirtualkeyboard"
"qt.59.qtvirtualkeyboard.win32_mingw53"
"qt.59.qtvirtualkeyboard.win32_msvc2015"
"qt.59.qtvirtualkeyboard.win64_msvc2013_64"
"qt.59.qtvirtualkeyboard.win64_msvc2015_64"
"qt.59.qtvirtualkeyboard.win64_msvc2017_64"
"qt.59.qtwebengine"
"qt.59.qtwebengine.win32_msvc2015"
"qt.59.qtwebengine.win64_msvc2015_64"
"qt.59.qtwebengine.win64_msvc2017_64"
"qt.59.src"
"qt.59.win32_mingw53"
"qt.59.win32_msvc2015"
"qt.59.win64_msvc2013_64"
"qt.59.win64_msvc2015_64"
"qt.59.win64_msvc2015_winrt_armv7"
"qt.59.win64_msvc2015_winrt_x64"
"qt.59.win64_msvc2015_winrt_x86"
"qt.59.win64_msvc2017_64"
"qt.59.win64_msvc2017_winrt_armv7"
"qt.59.win64_msvc2017_winrt_x64"
"qt.59.win64_msvc2017_winrt_x86"
"qt.enterpriseaddons"
"qt.enterpriseaddons.qtquickcompiler"
"qt.enterpriseaddons.qtquickcompiler.doc"
"qt.enterpriseaddons.qtquickcompiler.qt59.android_armv7"
"qt.enterpriseaddons.qtquickcompiler.qt59.android_x86"
"qt.enterpriseaddons.qtquickcompiler.qt59.win32_mingw53"
"qt.enterpriseaddons.qtquickcompiler.qt59.win32_msvc2015"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2013_64"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2015_64"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2015_winrt_armv7"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2015_winrt_x64"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2015_winrt_x86"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2017_64"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2017_winrt_armv7"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2017_winrt_x64"
"qt.enterpriseaddons.qtquickcompiler.qt59.win64_msvc2017_winrt_x86"
"qt.installer.changelog"
"qt.license.automotive"
"qt.license.embedded"
"qt.license.enterprise"
"qt.license.python"
"qt.tools"
"qt.tools.perl"
"qt.tools.qtcreator"
"qt.tools.qtcreator.enterprise.plugins"
"qt.tools.qtcreatorcdbext"
"qt.tools.vcredist_msvc2015_x64"
"qt.tools.vcredist_msvc2015_x86"
"qt.tools.win32_mingw530"

作为一个完整的功能,这是我在我们的 Windows 安装中使用的实际功能:

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.selectAll();

    widget.deselectComponent("qt.59.android_x86");
    widget.deselectComponent("qt.59.android_armv7");
    widget.deselectComponent("qt.59.win32_mingw53");
    widget.deselectComponent("qt.59.win64_msvc2013_64");
    widget.deselectComponent("qt.59.win64_msvc2017_winrt_armv7");
    widget.deselectComponent("qt.59.win64_msvc2015_winrt_armv7");
    widget.deselectComponent("qt.59.src");
    widget.deselectComponent("qt.tools.perl");
    widget.deselectComponent("qt.tools.win32_mingw530");

    gui.clickButton(buttons.NextButton);
}

如果您想了解如何从头开始制作这些脚本之一,您应该查看以下答案以开始使用:https://stackoverflow.com/a/34032216/3543437

5.9.1 更新

将所有具有59. 的字符串更改为591. for 5.9.1;如果您对 5.9.0 使用与 5.9.1 相同的脚本,由于未取消选择正确的组件,它将尝试安装所有内容。

5.9.3 更新

谢天谢地,他们似乎遵守了 5.9.1 的相同约定,所以只需将 59 更改为 593;我假设 5.9.2 以及任何后续的 5.9 版本也是如此。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多