如何在QML中从UNC路径设置FileDialog的文件夹?

时间:2017-10-10 17:33:14

标签: qt qml unc qt5.6

我想将最后使用的文件夹存储在qml的文件对话框中(使用Qt 5.6版)。我这样做的方式是通过QSettings,它具有url属性lastUsedFolder,如下所示:

/////////////
/// 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:后添加或删除多少正斜杠,都会显示相同的错误消息,并且在显示的路径中总是有三个斜杠

我将不胜感激任何建议,这些建议可以让我能够以一种可用于" local"的方式存储和重复使用FileDialog中最后使用过的文件夹。和UNC路径,即使它以与我们目前使用的方式不同的方式完成。

1 个答案:

答案 0 :(得分:2)

这似乎是Qt的一个错误。 QFileDialog尝试以错误的方式“纠正”您的URI,因为如果您将UNC路径(如“\ myRemotePC.somewhere.com \ myData \”)转换为URI,它将为您提供“file://myRemotePC.somewhere.com/ myData“,这部分是正确的,但从QFileDialog的角度来看,你试图获得一个本地文件夹。

我尝试使用原始字符串或网址提供QFileDialog,但QFileDialog仍然存在以转换路径。

如果您需要一个解决方法,请从C ++调用QFileDialog,它可以使用字符串路径,如UNC路径。

另一种解决方法是将外部文件夹连接为网络驱动器。

抱歉我的英语不好^^

如果有人想快速尝试。

MY.PATH.FTP.DIR