FileDialog 在调试模式下很好,但在发布模式下不如预期

FileDialog is fine is debug mode, but not as expected in release mode

用于保存文件的 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))
    }

}

发布模式

令人惊讶的是,在发布模式下,对话框是 open-type 而不是 save-type:

我试过:

但是,none 成功了!我研究过 this one 等类似的帖子,但建议没有用。我还能尝试什么?谢谢。

解决方案

已通过在 QML 文件中删除此导入进行修复:

import QtQuick.Dialogs 1.2

我猜测问题是 FileDialog 定义冲突。请注意,导入 QtQuick.DialogsQt.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 {
}