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

问题描述

用于保存文件的 QML npm run test:unit 在调试模式下工作正常。

Screenshot: debug mode: fine

代码是:

FileDialog

发布模式

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

Screenshot: release mode: bad

我试过了:

  • 更改 QML 导入版本
  • 清理发布构建目录
  • 修改 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)) } } 文件

然而,他们都没有工作!我研究过类似 this one 之类的帖子,但建议没有用。我还能尝试什么?谢谢。

解决方

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

qtquickcontrols2.conf

解决方法

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