MyTetra Share
Делитесь знаниями!
Хитрости установки Qt: без ввода логина-пароля от Qt-аккаунта и установка Qt в консольном режиме
Время создания: 13.01.2021 09:40
Автор: xintrea
Текстовые метки: qt, установка, инсталляция, логин, пароль, аккаунт, консоль
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Инсталляция Qt и сборка проектов
Запись: xintrea/mytetra_syncro/master/base/1610520041fvz1xmhbnh/text.html на raw.github.com

Фреймверк Qt, хоть и является Open Source проектом, но активно пытается огораживать пользователей и разработчиков от свободного использования этого ПО. Менеджеры Qt постоянно придумывают различные меры, которые формально не противоречат лицензии GPL, но мешают свободно и просто устанавливать необходимые инструменты экосистемы Qt.


Одной из таких мер является Qt-аккаунт. Он бесплатен, и никаких ограничений на регистрацию в нем (пока) нет. Зачем он нужен? Ну, с некоторых пор в процедуре установки Qt-фреймверка из официального инсталлятора в обязательном порядке требуется ввод логина/пароля от Qt-аккаунта. Если Qt-аккаунта нет, установить фреймверк Qt из официального полного инсталлятора не получится. То есть, пользователь выкачивает инсталлятор размером ~4GB, в котором есть все файлы для инсталляции, но без Qt-аккаунта развернуть файлы фреймверка не может.





Однако, обойти данное ограничение все-таки можно, просто нужно знать как.



Установка Qt без запроса логина/пароля


Оказывается, запрос логина/пароля при установке Qt происходит только в случае, если инсталлятор обнаруживает доступ в интернет и видит доступными сервера компании Qt. Действительно, если нет интернета, то как проверять правильность ввода логина/пароля? Никак. А очень часто приходится ставить Qt в местах, где интернета просто не предусмотрено. В инсталляторе Qt это предусмотрели, и сделали пропуск процедуры регистрации в случае отсутствия интернет-соединения, просто этот момент никак не поясняют и не афишируют.


Таким образом, в момент инсталляции можно просто потушить интернет-соединение, и установить Qt без Qt-аккаунта. Это можно делать вручную, а можно, при необходимости, автоматизировать. В моих скриптах Ansible под Linux это происходит так:



- name: Блокировка интернет-соединения, чтобы не запрашивался Qt-аккаунт в инсталляторе

shell: |

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -j DROP


... команды инсталляции Qt ...


- name: Разблокирование интернет-соединения

shell: |

iptables -F

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT



Видно, что в этих командах остается рабочим порт SSH, остальные соединения временно перекрываются. Что-то подобное можно сделать и в Windows, это отдельный разговор. Факт в том, что при отсутствии интернет-соединения, нет необходимости в наличии логина/пароля от Qt аккаунта.


Не хочется крутить iptables? Можно просто выдернуть сетевой кабель из компьютера, установить Qt, потом вставить кабель на место. В случае WiFi соединения можно просто на время потушить это соединение.



Установка фреймверка Qt через консоль


Графический инсталлятор Qt может так же работать и в консольном режиме. Таким образом в Linux можно установить Qt из официального инсталлятора даже при отсутствии графического окружения X11. Для инсталляции в консольном режиме используется опция инсталляции --script, в которой указывается файл скрипта в формате *.qs:



cd /home/user/work/install

./qt-opensource-linux-x64-5.9.6.run --platform minimal --script install.qs


В данном скрипте описываются действия, которые должны поисходить при появлении того или иного окна инсталлятора. Скрипт пишется на языке JavaScript. Окна инсталлятора создаются "виртуально" внутри движка инсталлятора, и это позволяет выполнять действия так, как будто их выполняет пользователь.



Инсталлятор фреймверка Qt сделан с помощью инструмента Qt Installer Framework, который предназначен для создания инсталляторов к ПО. Подробнее об этом инструменте можно прочитать здесь: https://doc.qt.io/qtinstallerframework/ifw-overview.html


А формат QS-скриптов подробно описан в следующей документации: https://doc.qt.io/qtinstallerframework/noninteractive.html



Для Qt версии 5.9.6 файл скрипта install.qs может выглядеть так:



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("/opt/qt_5_9_6");

gui.clickButton(buttons.NextButton);

}


Controller.prototype.ComponentSelectionPageCallback = function() {

var widget = gui.currentPageWidget();


widget.selectAll();


// Можно выбирать компоненты отдельно

// 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);

}



Опция --platform задает плагин, который используется при инсталляции. Для консольной инсталляции указывается плагин minimal.


Более подробно об опциях инсталлятора в консольном режиме (Command Line Interface) написано здесь: https://doc.qt.io/qtinstallerframework/ifw-cli.html


* * *


Хинт! Ссылки на прямое скачивание инсталлятора Qt для различных версий фреймверка и различный аппаратные платформы можно найти в статье:



Прямые ссылки на оффлайн-инсталлятор Qt версий 5.12.x



Данные ссылки активны на январь 2021 года.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования