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:
我试过:
- 更改 QML 导入版本
- 清理发布构建目录
- 修改
qtquickcontrols2.conf
文件
但是,none 成功了!我研究过 this one 等类似的帖子,但建议没有用。我还能尝试什么?谢谢。
解决方案
已通过在 QML 文件中删除此导入进行修复:
import QtQuick.Dialogs 1.2
我猜测问题是 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 {
}
用于保存文件的 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
文件
但是,none 成功了!我研究过 this one 等类似的帖子,但建议没有用。我还能尝试什么?谢谢。
解决方案
已通过在 QML 文件中删除此导入进行修复:
import QtQuick.Dialogs 1.2
我猜测问题是 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 {
}