grig_p
grig_p3. Mai 2017 09:03

Qt Installer Framework. Инсталлятор без GUI

Здравствуйте, Евгений!
Вопрос такой. А можно ли сделать на основе Qt инсталлятор вообще без интерфейса? "Тихая" установка с заданными параметрами.
Я вижу только один путь, куда можно копать - пример DynamicPage:
https://doc.qt.io/qtinstallerframework/qt-installer-framework-dynamicpage-example.html ,
повыключать все окна так:

installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
Но мне этот вариант кажется некрасивым. Может, есть какой-то более красивый вариант?
Заранее благодарен за ответ.
С уважением, Григорий
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

10
Evgenii Legotckoi
  • 3. Mai 2017 11:25

Вечер добрый, Григорий!
Что-то Вы совсем официально в этот раз ))

Вроде как, можно запускать инсталлятор Qt с аргументом --script и указанием запускаемого скрипта. Который будет выполнять все необходимые действия за пользователя. Это будет как раз как тихая установка.

Вот на такое я натыкался в интернете:

script.qs
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.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");

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

А так будет выполняться запуск для скрипта для инсталлятор maitenance tool:

maintenancetool.exe --script=script.qs

Для тихой проверки обновлений можно использовать аргумент --checkupdates

Но если честно, тихая проверка обновлений требует запуска инсталлятора как процесса из под другой программы. В итоге мы в своё время решили, что лучше написать отдельный класс для использования QNetworkAccessManager , который сам проверяет версию в Updates.xml в удалённом репозитории. Хотя вариант с maitenance tool тоже может работать.

    grig_p
    • 4. Mai 2017 03:37

    Огромное спасибо за подсказку.
    Официально? Да нет, я ни о чем таком не думал :)
    Методика работает. Но не совсем "тихо". Показывается окно прогресса.
    Пытаюсь его убрать таким способом:

    function Component() {
        if (installer.isInstaller()) {
            component.loaded.connect(this, Component.prototype.installerLoaded);
            installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
        }
    }
    
    Но не убирается. Выключаю автонажатие на кнопку и через setDefaultPageVisible другие окна, они тоже не убираются.
    В чем может быть причина?
      Evgenii Legotckoi
      • 4. Mai 2017 09:18

      Я не уверен, но может быть строчка с коннектом не позволяет отключить страницу?
      Вроде в мануалах также делается через setDefaultPageVisible.

        grig_p
        • 4. Mai 2017 09:36

        Убирал строчку коннекта - не помогает.
        Но сделал следующий финт:

        Controller.prototype.PerformInstallationPageCallback = function()
        {
            installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
        }
        
        Окно сразу закрылось и ничего не поставилось. Установка закончилась неудачей.
          Evgenii Legotckoi
          • 4. Mai 2017 09:44

          Вот здесь идёт обсуждение тихого режима на багтрекере Qt.
          И из того, что там пишут, можно попробовать во-первых запустить инсталлятор с аргументом --silent . А также применить следующий код:

          gui.setSilent(true)

          Не ясно только, где его вызывать. В Component или в Controller()

          Кстати, там же есть и пример кода с setDefaultPageVisible

          function Controller() {
              installer.setDefaultPageVisible(QInstaller.Introduction, false);
              installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
              installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
              installer.setDefaultPageVisible(QInstaller.LicenseCheck, false);
              installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
              installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
              installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
          
              installer.autoRejectMessageBoxes();
              installer.installationFinished.connect(function() {
                  gui.clickButton(buttons.FinishButton);
              })
          }

          То есть выполняется этот метод не Component(), а в Controller(). Могу предложить проверить все эти варианты.

            grig_p
            • 5. Mai 2017 01:43

            Спасибо большое! Буду пробовать

              grig_p
              • 5. Mai 2017 02:34

              Попробовал. 1) --silent неизвестный аргумент, игнорируется 2) gui.setSilent(true); Если ее вызывать в скрипте - параметре инсталлятора в Component, то инсталлятор ее не видит, а в Controller, то выдает "Property setSilent of QInstaller::GuiProxy is not a function" Если ее вызывать в скрипте пакета, то она всегда выдает это сообщение. 3) Вызов installer.setDefaultPageVisible(QInstaller.PerformInstallation, false); из скрипта - параметра в Controller приводит к тому, что инсталляция вообще не происходит. Вызов в Componet игнорируется. Если ее вызывать в скрипте пакета, то инсталляция вообще не происходит в обоих случаях.

                grig_p
                • 5. Mai 2017 02:35

                Попробовал.
                1) --silent неизвестный аргумент, игнорируется
                2) gui.setSilent(true);
                Если ее вызывать в скрипте - параметре инсталлятора в Component, то инсталлятор ее не видит, а в Controller, то выдает "Property setSilent of QInstaller::GuiProxy is not a function"
                Если ее вызывать в скрипте пакета, то она всегда выдает это сообщение.

                3) Вызов installer.setDefaultPageVisible(QInstaller.PerformInstallation, false); из скрипта - параметра в Controller приводит к тому, что инсталляция вообще не происходит.
                Вызов в Componet игнорируется.
                Если ее вызывать в скрипте пакета, то инсталляция вообще не происходит в обоих случаях.

                  Evgenii Legotckoi
                  • 5. Mai 2017 03:49

                  Тогда у меня больше нет идей ((

                    grig_p
                    • 5. Mai 2017 08:26

                    Ясно, спасибо. Сделал без Qt. На командных файлах. Вроде, работает.

                      Kommentare

                      Nur autorisierte Benutzer können Kommentare posten.
                      Bitte Anmelden oder Registrieren
                      Letzte Kommentare
                      A
                      ALO1ZE19. Oktober 2024 08:19
                      Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5. Oktober 2024 07:51
                      Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55. Juli 2024 11:02
                      QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      k
                      kmssr8. Februar 2024 18:43
                      Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      Jetzt im Forum diskutieren
                      J
                      JacobFib17. Oktober 2024 03:27
                      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                      JW
                      Jhon Wick1. Oktober 2024 15:52
                      Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                      КГ
                      Кирилл Гусарев27. September 2024 09:09
                      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                      F
                      Fynjy22. Juli 2024 04:15
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Folgen Sie uns in sozialen Netzwerken