在ubuntu服务器上安装Qt run安装程序

时间:2014-08-03 13:45:47

标签: qt install ubuntu-server

我想知道是否有办法在Ubuntu Server上静默安装Qt运行安装程序?
我的意思是绕过安装程序的选项并进行默认安装?

12 个答案:

答案 0 :(得分:55)

Qt工具包使用Qt安装程序框架(QtIFW)打包。 QtIFW安装程序支持--script选项,允许您通过Controller Scripting API以编程方式控制安装。这里的qt-installer-noninteractive.qs文件以非交互方式安装Qt 5:

// 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也有助于计算组件名称。

答案 1 :(得分:8)

从安装程序3.0.2-online 29-11-2017开始,您必须在JS脚本中添加延迟,因为“欢迎”页面中的“下一步”按钮被禁用一秒左右。

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

答案 2 :(得分:6)

对于不同类型的Qt,回答向导的问题几乎没有什么不同。为了使它更简单,我打包了一个通用脚本来从离线/在线安装程序中提取Qt。

脚本: qtci/extract-qt-installer at master · benlau/qtci

示例用法:

extract-qt-installer qt-opensource-linux-x64-android-5.5.1.run ~/Qt

环境变量"

VERBOSE [Optional] Set to "true" will enable VERBOSE output
QT_CI_PAGEAGES [Optional] Select the components to be installed instead of using default (eg. QT_CI_PAGEAGES="qt.59.gcc_64")

此外,它有很少的脚本可以下载和安装不同版本的Qt。

qtci/recipes at master · benlau/qtci

答案 3 :(得分:6)

绕过“用户数据收集”屏幕

自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();

    // ...
}

有关Windows的更完整示例,请参见here

答案 4 :(得分:2)

看看这个很棒的项目:aqtinstall https://github.com/miurahr/aqtinstall/

它可以在Linux,Mac和Windows计算机上安装Qt,而无需任何交互。

还有一个使用此工具的Github操作:https://github.com/jurplel/install-qt-action

答案 5 :(得分:2)

从3.2.1开始,凭据现在是必需的,如上所述。在~/.local/share/qt中创建了一个qtaccount.ini文件。如果您无法保存和重复使用该文件,例如由于您的脚本需要为多个用户使用,则可以使用此新的 CredentialsPageCallback

Controller.prototype.CredentialsPageCallback = function() {
  var page = gui.pageWidgetByObjectName("CredentialsPage");
  page.loginWidget.EmailLineEdit.setText("MYEMAIL");
  page.loginWidget.PasswordLineEdit.setText("MYPASSWORD");
  gui.clickButton(buttons.NextButton);
}

和往常一样,在移动密码时要特别小心,尤其是在明文形式的情况下。

答案 6 :(得分:1)

我遇到了同样的问题,并提出了一个简单的python脚本,该脚本的功能基本上与官方的Qt安装程序相同。您可以找到它here

这就是使用它的方式:

sudo apt install python3-requests p7zip-full wget

wget https://git.kaidan.im/lnj/qli-installer/raw/master/qli-installer.py
chmod +x qli-installer.py

./qli-installer.py 5.11.3 linux desktop

然后在这种情况下,可以在./5.11.3/gcc_64/处找到Qt安装。对于其他系统/目标(即mac ioslinux android android_armv7),这当然会有所不同。

https://lnj.gitlab.io/post/qli-installer/

答案 7 :(得分:1)

Qt安装程序v4.0已发布,现在可以无头运行:

qt-unified-windows.exe install --root C:\Qt\InstallFolder

您可以使用--help列出可用命令:

qt-unified-windows.exe --help

命令行安装程序需要用户交互,但是可以使用标志来绕过它。有关完整列表,请参见this wiki page

您可以下载安装程序here

答案 8 :(得分:0)

这对我有用!

 export DISPLAY=:1
 Xvfb :1 -screen 0 1024x768x16 &
 fluxbox &
 x11vnc -display :1 &

使用任何vnc客户端连接到服务器

答案 9 :(得分:0)

上面的脚本很旧。这应该可以工作(并且我添加了重试下载错误)

function Controller() {
    installer.autoRejectMessageBoxes();
    installer.setMessageBoxAutomaticAnswer("installationError", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("installationErrorWithRetry", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("DownloadError", QMessageBox.Retry);
    installer.setMessageBoxAutomaticAnswer("archiveDownloadError", QMessageBox.Retry);
    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()
{
    //dev is the user in our docker image
    gui.currentPageWidget().TargetDirectoryLineEdit.setText(installer.value("HomeDir") + "/Qt");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.PerformInstallationPageCallback = function() {
    gui.clickButton(buttons.CommitButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    function list_packages() {
      var components = installer.components();
      console.log("Available components: " + components.length);
      var packages = ["Packages: "];
      for (var i = 0 ; i < components.length ;i++) {
          packages.push(components[i].name);
      }
      console.log(packages.join(" "));
    }

    list_packages();

    var widget = gui.currentPageWidget();

    console.log(widget);

    widget.deselectAll();
    widget.selectComponent("qt.qt5.5130");
    widget.selectComponent("qt.qt5.5130.gcc_64");
    // widget.deselectComponent("");

    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.run -platform minimal --verbose --script ./qt-installer-noninteractive.qs 

答案 10 :(得分:0)

几个月前,我为Qt安装自动化制作了可配置的帮助程序脚本。尽管它不是真正的无头安装程序,但它只是通过安装向导屏幕进行迭代,因此可以在连续集成服务器中使用,并且实际上已经通过这种方式进行了测试。

注意事项和功能:

  • 可在Linux,MacOS和Windows上使用。
  • Qt版本,组件和安装路径是可配置的。
  • 始终使用最新的在线安装程序。
  • 在Travis CI中测试。
  • Bash是必需的,但是它通常存在于连续集成服务器中(至少在Travis中存在)。
  • 公共域(通过CC0豁免)。

主页:https://github.com/skalee/non-interactive-qt-installer

答案 11 :(得分:0)

必须输入凭据才能通过凭据菜单。 为了避免有必要使用以下网络参数运行docker build命令:

docker build --network none -t <img_name> <Dockerfile_path>

要在docker中成功运行qt交互式安装,缺少了一些东西。