grig_p
grig_p3 мая 2017 г. 19: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
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

10
Evgenii Legotckoi
  • 3 мая 2017 г. 21: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 мая 2017 г. 13:37

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

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

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

        grig_p
        • 4 мая 2017 г. 19:36

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

        Controller.prototype.PerformInstallationPageCallback = function()
        {
            installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
        }
        
        Окно сразу закрылось и ничего не поставилось. Установка закончилась неудачей.
          Evgenii Legotckoi
          • 4 мая 2017 г. 19: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 мая 2017 г. 11:43

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

              grig_p
              • 5 мая 2017 г. 12: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 мая 2017 г. 12: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 мая 2017 г. 13:49

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

                    grig_p
                    • 5 мая 2017 г. 18:26

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

                      Комментарии

                      Только авторизованные пользователи могут публиковать комментарии.
                      Пожалуйста, авторизуйтесь или зарегистрируйтесь
                      Ua

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:84баллов,
                      • Очки рейтинга4
                      Ua

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:42баллов,
                      • Очки рейтинга-8
                      ОК

                      Qt - Тест 001. Сигналы и слоты

                      • Результат:47баллов,
                      • Очки рейтинга-6
                      Последние комментарии
                      ИМ
                      Игорь Максимов22 ноября 2024 г. 21:51
                      Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      Evgenii Legotckoi
                      Evgenii Legotckoi31 октября 2024 г. 23:37
                      Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                      A
                      ALO1ZE19 октября 2024 г. 17:19
                      Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь Максимов5 октября 2024 г. 16:51
                      Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas55 июля 2024 г. 20:02
                      QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      Сейчас обсуждают на форуме
                      f
                      firstlunoxod15 февраля 2025 г. 13:46
                      Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                      Дмитрий
                      Дмитрий3 февраля 2025 г. 16:24
                      Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                      NW
                      Nayo Wai30 января 2025 г. 19:22
                      не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                      n
                      nkly3 января 2025 г. 12:52
                      Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                      M
                      Marsel17 августа 2023 г. 0:26
                      OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                      Следите за нами в социальных сетях