【问题标题】:FileDialog is fine is debug mode, but not as expected in release modeFileDialog 在调试模式下很好,但在发布模式下不如预期
【发布时间】:2021-01-20 13:19:45
【问题描述】:

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

我试过了:

  • 更改 QML 导入版本
  • 清理发布构建目录
  • 修改qtquickcontrols2.conf文件

但是,它们都不起作用!我研究过类似的帖子,如this one,但建议没有用。我还能尝试什么?谢谢。

解决方案

通过在 QML 文件中删除此导入来修复:

import QtQuick.Dialogs 1.2

【问题讨论】:

    标签: qt qml qfiledialog


    【解决方案1】:

    我猜这个问题是 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 {
    }
    

    【讨论】:

    • 通过在 QML 文件中删除此导入修复:import QtQuick.Dialogs 1.2
    • 使用你的解决方案我得到一个错误:file:///D:/Qt5.12/5.12.10/mingw73_64/qml/QtQuick/Dialogs/DefaultFileDialog.qml:102:33: QML Settings : 初始化 QSettings 实例失败。状态码为:1 file:///D:/Qt5.12/5.12.10/mingw73_64/qml/QtQuick/Dialogs/DefaultFileDialog.qml:102:33:QML设置:未设置以下应用程序标识符:QVector ("organizationName", "organizationDomain")
    • 该警告与我的解决方案无关。只是说 FileDialog 内部使用了 QSettings,它希望您定义组织名称和域。阅读docs 了解更多信息。但我认为即使显示该消息,您的应用仍然可以运行。
    • 谢谢。从 DefaultFileDialog.qml 的源代码来看,它确实使用了 QSettings 本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多