Qt 如何设置FileDialog';是否从QML中的UNC路径删除文件夹?

Qt 如何设置FileDialog';是否从QML中的UNC路径删除文件夹?,qt,qml,unc,qt5.6,Qt,Qml,Unc,Qt5.6,我想将最后使用的文件夹存储在qml的文件对话框中(使用QtVersion5.6)。我这样做的方式是通过具有url属性的QSettingslastUsedFolder: ///////////// /// myApp.qml ///////////// import QtQuick 2.3 import QtQuick.Dialogs 1.1 import Qt.labs.settings 1.0 Settings { id: settings property url las

我想将最后使用的文件夹存储在qml的文件对话框中(使用QtVersion5.6)。我这样做的方式是通过具有url属性的QSettings
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方法存储,控制台将打印
保存文件夹:file://myRemotePC.somewhere.com/myData
。然后,当我再次打开对话框时,onVisibleChanged触发。
doesFolderStillExists
方法查看文件夹-QUrl.toLocalFile似乎正常-以及
设置中存储的路径。lastUsedFolder
仍然与存储的路径相同。但是,应用程序在分配给
文件夹
属性的行上崩溃,出现以下错误(Windows 7;最后一次控制台打印只是“设置对话框文件夹”):

QWindowsNativeFileDialogBase::shellItem:SHCreateItemFromParsingName(file:///myRemotePC.somewhere.com/myData)失败()

换句话说,当我试图使用与我之前从对话框中读取的完全相同的值设置对话框的文件夹属性时,它崩溃了……这让我感到困惑

不确定这是否重要,但我注意到一件奇怪的事情是,错误消息在
文件之后有三个斜杠:
,而我设置为文件夹的路径只有两个斜杠。我尝试以各种方式修改路径:

  • 如果完全忽略
    文件:
    ,则对话框将在默认位置打开,可能无法以有意义的方式解析地址,这是预期的
  • 无论我在
    文件:
    之后添加或删除了多少斜杠,都会显示相同的错误消息,在显示的路径中始终有三个斜杠

如果有任何建议能让我以一种对“本地”和UNC路径都可用的方式在FileDialog中存储和重新使用上次使用的文件夹,我将不胜感激,即使它是以与我们当前使用的方式不同的方式完成的。

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

我试图向QFileDialog提供原始字符串或url,但QFileDialog会坚持转换路径

如果需要一个解决方案,从C++调用QFileDialog,它使用UNC路径的字符串路径。

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

对不起,我的英语很差^^

如果有人想快速尝试

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import Qt.labs.settings 1.0

Window {
Component.onCompleted: {
    openDialog.open();
}

FileDialog {
    id: openDialog
    selectFolder: true
    Component.onCompleted:  folder = settings.lastFolderURL;
    onVisibleChanged:
    {
        console.log("lastFolder as string " + settings.lastFolderString);
        console.log("lastFolder as URL " + settings.lastFolderURL);
    }
    onAccepted:
    {
        console.log("Selected folder : " + folder)
        settings.lastFolderString = folder;
        settings.lastFolderURL = folder;
    }
}

Settings {
    id: settings
    property string lastFolderString ;
    property url lastFolderURL;
}
}

从C++方面执行对话可能是一种选择,虽然很难看,但我希望有更好的方法,但是谢谢。连接远程位置作为一种驱动程序,但不能解决崩溃问题——人们会继续向我们提供支持,即当使用网络驱动器时软件崩溃。(在我的领域,人们经常使用网络驱动器)。我可以检查路径是否为UNC,并且不会“记住”如果是这样的话,这会给用户带来一些便利。但是,我同意您的发现-看起来FileDialog在onFolderChanged期间对路径进行了某种转换/更正,但没有考虑UNC路径:(C++中的Calling QFileDialog不一定是一个难看的选项,QML对于图形目的来说非常强大,但是在大数据处理或特定行为的情况下,最好用C++来编码,QT在文档的第一行中说。