我想知道是否有一种方法可以在Ubuntu服务器上静默安装Qt运行安装程序?
我的意思是绕过安装程序的选项,进行默认安装?
发布于 2015-12-02 07:29:23
Qt工具包是使用Qt安装程序框架(QtIFW)打包的。QtIFW安装程序支持--script
选项,该选项允许您通过Controller Scripting API以编程方式控制安装。下面是以非交互方式安装Qt 5的qt-installer-noninteractive.qs
文件:
// Emacs mode hint: -*- mode: JavaScript -*-
function Controller() {
installer.autoRejectMessageBoxes();
installer.installationFinished.connect(function() {
gui.clickButton(buttons.NextButton);
})
}
Controller.prototype.WelcomePageCallback = function() {
// click delay here because the next button is initially disabled for ~1 second
gui.clickButton(buttons.NextButton, 3000);
}
Controller.prototype.CredentialsPageCallback = function() {
gui.clickButton(buttons.NextButton);
}
Controller.prototype.IntroductionPageCallback = function() {
gui.clickButton(buttons.NextButton);
}
Controller.prototype.TargetDirectoryPageCallback = function()
{
gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/Qt");
gui.clickButton(buttons.NextButton);
}
Controller.prototype.ComponentSelectionPageCallback = function() {
var widget = gui.currentPageWidget();
widget.deselectAll();
widget.selectComponent("qt.55.gcc_64");
widget.selectComponent("qt.55.qtquickcontrols");
// widget.deselectComponent("qt.tools.qtcreator");
// widget.deselectComponent("qt.55.qt3d");
// widget.deselectComponent("qt.55.qtcanvas3d");
// widget.deselectComponent("qt.55.qtlocation");
// widget.deselectComponent("qt.55.qtquick1");
// widget.deselectComponent("qt.55.qtscript");
// widget.deselectComponent("qt.55.qtwebengine");
// widget.deselectComponent("qt.extras");
// widget.deselectComponent("qt.tools.doc");
// widget.deselectComponent("qt.tools.examples");
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);
}
此脚本演示了如何选择/取消选择某些组件。根据您的需要进行自定义,或者完全删除默认安装所需的行。同样,您可能希望自定义或删除TargetDirectoryLineEdit
行。如下所示运行Qt安装程序:
qt-opensource-linux-x64-5.5.1.run --script qt-installer-noninteractive.qs
添加-platform minimal
以进行无头安装。基于较新版本QtIFW的未来安装程序应该能够改用--silent
选项(请参阅QTIFW-166)。
添加--verbose
以获得更详细的控制台输出(有助于收集组件名称、向导页面名称等)。This link对于确定组件名称也很有帮助。
发布于 2017-12-15 02:45:43
从installer 4.X
开始,您不再需要处理JS文件。Qt online installer的4.0
版本对无头安装提供了一流的支持。有关详细信息,请参阅this answer。
从installer 3.0.2-online
2017年29月11日起,您必须在JS脚本中添加延迟,因为“欢迎”页面中的“下一步”按钮被禁用了一秒钟左右。
Controller.prototype.WelcomePageCallback = function() {
gui.clickButton(buttons.NextButton, 3000);
}
这一次,他们在3.2.1-online
29-01-2020 release page上解释了如何跳过新表单
Controller.prototype.ObligationsPageCallback = function() {
var page = gui.pageWidgetByObjectName("ObligationsPage");
page.obligationsAgreement.setChecked(true);
page.completeChanged();
gui.clickButton(buttons.NextButton);
}
有些人可能想知道如何创建神秘的qtaccount.ini
文件(从3.2.1-2-online
开始就需要)。Qt只告诉我们它应该放在~/.local/share/Qt/
中。我找不到任何其他信息。当您第一次输入凭据时,安装程序会自行创建此文件。因此,只需手动安装并在帐户表单后退出即可。生成的文件如下所示
[General]
email=my.email@domain.ca
pass=mypass
[QtAccount]
email=my.email@domain.ca
jwt=a long hash
u=a small hash
发布于 2019-10-09 04:38:22
2020更新:现在有了更好的方法。
Qt online installer的4.0
版本对无头安装提供了一流的支持。
有关详细信息,请参阅this answer below。
原始答案:
绕过"User Data Collection“屏幕
从2019年10月8日起,Windows上添加了一个额外的屏幕,这将导致安装挂起。您可以通过在.qs
文件中添加以下内容来单击它:
Controller.prototype.DynamicTelemetryPluginFormCallback = function() {
var widget = gui.currentPageWidget();
widget.TelemetryPluginForm.statisticGroupBox.disableStatisticRadioButton.checked = true;
gui.clickButton(buttons.NextButton);
}
选择“存档”和“最新版本”
最近的另一个变化是打包类别。LTS现在是默认选择的唯一一个,这意味着您不能安装最新的Qt版本,除非首先在包类别中选择“最新版本”。
下面是如何做到这一点的:
Controller.prototype.ComponentSelectionPageCallback = function() {
var page = gui.pageWidgetByObjectName("ComponentSelectionPage");
var archiveCheckBox = gui.findChild(page, "Archive");
var latestCheckBox = gui.findChild(page, "Latest releases");
var fetchButton = gui.findChild(page, "FetchCategoryButton");
archiveCheckBox.click();
latestCheckBox.click();
fetchButton.click();
// ...
}
有关更完整的示例,请参阅here。
https://stackoverflow.com/questions/25105269
复制相似问题