FileDialog в порядке в режиме отладки, но не так, как ожидалось, в режиме выпуска

QML FileDialog для сохранения файла отлично работает в режиме отладки.

Скриншот: режим отладки: нормально

Код:

import QtQuick 2.5
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Dialogs 1.2
import Qt.labs.settings 1.1
import QtQuick.Controls.Styles 1.4
import Qt.labs.platform 1.0

Item {

    property string exportSceneName: "exported_scene"
    property url exportFolder: StandardPaths.writableLocation(StandardPaths.DocumentsLocation)

    signal  startExport()

    onStartExport: {
        runLogic()
    }

    function runLogic() {
        // ...
    }

    Button {
        onClicked: {
            fileDialog.open()
        }
    }
    
    FileDialog {
        id: fileDialog
        folder: exportFolder
        fileMode: FileDialog.SaveFile
        title: qsTr("Export Scene As STL")
        onAccepted: {
            exportFolder = folder
            var name = basename(file)
            exportSceneName = name
            startExport()
        }
    }

    function basename(str) {
        return (String(str).slice(String(str).lastIndexOf("/")+1))
    }

}

Режим выпуска

Удивительно, но в режиме деблокирования диалоговое окно имеет тип открыть, а не тип сохранить:

Скриншот: режим выпуска: плохой

Я пытался:

  • Изменить версии импорта QML
  • Очистите каталог сборки выпуска
  • Изменить qtquickcontrols2.conf файл

Однако ни один из них не работал! Я изучил похожие сообщения, такие как этот, но предложения не сработали. Что еще я могу попробовать? Спасибо.

РЕШЕНИЕ

Исправлено путем удаления этого импорта внутри файла QML:

import QtQuick.Dialogs 1.2

person user3405291    schedule 20.01.2021    source источник


Ответы (1)


Я предполагаю, что проблема заключается в конфликте определений FileDialog. Обратите внимание, что оба импорта QtQuick.Dialogs и Qt.labs.platform предоставляют объект с именем FileDialog, но они используют разные API. (В QML есть несколько других подобных объектов, и это действительно раздражает.) Так что, вероятно, он пытается использовать одну версию диалога в режиме отладки, но по какой-то причине выбирает другую в режиме выпуска.

Решение состоит в том, чтобы, прежде всего, убедиться, что вы удалили все импорты, которые на самом деле не используете. Затем, если вам все еще нужны оба, вы можете пометить импорт:

import QtQuick.Dialogs 1.2 as QDiag
import Qt.labs.platform 1.0 as QPlat

Затем, когда вы создаете FileDialog, вам нужно будет явно указать, какой из них вы хотите использовать.

QDiag.FileDialog {
}

QPlat.FileDialog {
}
person JarMan    schedule 20.01.2021
comment
Исправлено путем удаления этого импорта внутри файла QML: import QtQuick.Dialogs 1.2 - person user3405291; 21.01.2021
comment
С вашим решением я получил ошибку: file:///D:/Qt5.12/5.12.10/mingw73_64/qml/QtQuick/Dialogs/DefaultFileDialog.qml:102:33: Настройки QML: не удалось инициализировать экземпляр QSettings. Код состояния: 1 файл:///D:/Qt5.12/5.12.10/mingw73_64/qml/QtQuick/Dialogs/DefaultFileDialog.qml:102:33: Настройки QML: Не установлены следующие идентификаторы приложений: QVector (название организации, домен организации) - person Lancehhh; 02.04.2021
comment
Это предупреждение не имеет ничего общего с моим решением. Это просто говорит о том, что FileDialog внутренне использует QSettings, который хочет, чтобы вы определили имя организации и домен. Прочтите документы для получения дополнительной информации. Но я думаю, что ваше приложение все равно будет работать, даже если оно покажет это сообщение. - person JarMan; 02.04.2021
comment
Спасибо. Из исходного кода DefaultFileDialog.qml он использует сам QSettings. - person Lancehhh; 06.04.2021