Qt Installer Framework - запретить установку в непустую папку

Я использую Qt Installer Framework.

Я хочу знать, как предотвратить установку в непустую папку?

Кроме того, как заставить деинсталлятор удалить только те файлы и папки, которые он установил, а не все содержимое его папки?

заранее спасибо


person BobL    schedule 28.06.2019    source источник


Ответы (1)


Благодаря документации Qt у вас есть доступ к QDesktopServices внутри Scripting API, который содержит функцию findFiles(string path,string pattern), которая не должна возвращать ничего в вашем случае, где путь — это ваш целевой каталог для установки.

На странице установки установщика TargetDirectory у вас есть доступ к заданному TargetDirectory через Страница установщика, к которой можно подключиться, если есть какое-то редактирование.

Мне потребовалось немало времени, чтобы придумать следующее решение, которое, должен признать, не такое, как я хотел заранее.

Прежде всего вам нужен управляющий скрипт, который нужно установить внутри вашего config.xml. Он называется controlScript.js и находится в том же каталоге, что и ваш config.xml.

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<Installer>
    <Name>Your application</Name>
    <Version>1.0.0</Version>
    <Title>Your application Installer</Title>
    <Publisher>Your vendor</Publisher>
    <StartMenuDir>Super App</StartMenuDir>
    <TargetDir>@HomeDir@/InstallationDirectory</TargetDir>
    <ControlScript>controlScript.js</ControlScript>
</Installer>

Теперь единственное решение, которое я принес на работу, заключается в следующем:

controlScript.js

function Controller()
{
    console.log("Control script");
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();
    widget.title="Select empty directory!";
    var targetDirWidget = gui.pageById(QInstaller.TargetDirectory);

    var targetDir=targetDirWidget.TargetDirectoryLineEdit.text;

    var files=QDesktopServices.findFiles(targetDir, "*.*");
    if (files.length!=0) {
        var result = QMessageBox.warning("quit.question", "You selected a non-empty directory!", targetDir,QMessageBox.Ok);
        gui.clickButton(buttons.BackButton);        
    }    

}

По сути, пользователь входит в целевой каталог и нажимает кнопку «Назад». Если целевой каталог не пуст, отображается окно сообщения и нажимается кнопка «Назад» в разделе «Выбор компонентов».

Моим желаемым решением было заранее деактивировать кнопку NextButton на странице TargetDirectory, но все мои попытки оказались тщетными. Несмотря на то, что следующее отключение NextButton должно работать, как показано в этом ответе.

person Aleph0    schedule 01.07.2019
comment
@BobL: Если вы удовлетворены решением, вы можете проголосовать и принять его. :-) - person Aleph0; 04.07.2019