【发布时间】:2018-03-22 05:02:39
【问题描述】:
我想将上次使用的文件夹存储在 qml 的文件对话框中(使用 Qt 5.6 版)。我这样做的方式是通过具有 url 属性 lastUsedFolder 的 QSettings :
/////////////
/// myApp.qml
/////////////
import QtQuick 2.3
import QtQuick.Dialogs 1.1
import Qt.labs.settings 1.0
Settings {
id: settings
property url lastUsedFolder;
}
FileDialog {
id: openDialog
onVisibleChanged:
{
if(visible && myApp.doesFolderStillExist(settings.lastUsedFolder))
{
console.log("setting folder of dialog")
folder = settings.lastUsedFolder
console.log(folder)
}
}
onAccepted:
{
console.log("saving folder: " + folder)
settings.lastUsedFolder = folder;
}
}
/////////////
/// myApp.cpp
/////////////
bool myApp::doesFolderStillExist(QUrl folderUrl)
{
QFileInfo folder(folderUrl.toLocalFile());
if (folder.exists())
return true;
return false;
}
这在处理本地文件时效果很好,但在使用由 UNC 格式路径(例如 \\myRemotePC.somewhere.com\myData\)寻址的远程计算机上的文件时就不行了。
如果我导航到该地址并接受对话框,则由于 onAccepted 方法而存储了该文件夹,并且控制台将打印saving folder: file://myRemotePC.somewhere.com/myData。然后当我再次打开对话框时, onVisibleChanged 触发。 doesFolderStillExists 方法看到文件夹 - QUrl.toLocalFile 似乎工作 - 而且settings.lastUsedFolder 中的存储路径仍然与存储的相同。但随后应用程序在分配给folder 属性的行上崩溃并出现以下错误(Windows 7;最后一个控制台打印只是“对话框的设置文件夹”):
QWindowsNativeFileDialogBase::shellItem: SHCreateItemFromParsingName(file:///myRemotePC.somewhere.com/myData) failed ()
换句话说,当我尝试使用我之前从中读取的完全相同的值来设置对话框的文件夹属性时,它会崩溃......这让我感到困惑。
不确定这是否重要,但我注意到一件奇怪的事情是错误消息在file: 之后有三个正斜杠,而我设置为文件夹的路径只有两个。我尝试通过各种方式修改路径:
- 如果
file:完全省略,对话框会在默认位置打开,可能无法以有意义的方式解析地址 - 这是意料之中的 - 无论我在
file:之后添加或删除多少个正斜杠,都会出现相同的错误消息,显示路径中始终包含三个斜杠
如果有任何建议可以使我能够以适用于“本地”和 UNC 路径的方式存储和重新使用 FileDialog 中最后使用的文件夹,我将不胜感激,即使它是在与我们目前使用的方式不同。
【问题讨论】: