2017-10-10 28 views
1

qml (Qt 버전 5.6 사용)의 파일 대화 상자에 마지막으로 사용한 폴더를 저장하려고합니다. 내가 할 방법은 같은 url 속성 lastUsedFolder을 가지고 QSettings 통해 :QML의 UNC 경로에서 FileDialog의 폴더를 설정하는 방법은 무엇입니까?

///////////// 
/// 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의 저장된 경로는 저장된 것과 동일합니다. , 즉

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

:; 그러나 다음과 같은 오류와 함께 folder 속성에 할당하는 줄에 응용 프로그램 충돌 (Windows 7의 마지막 콘솔 인쇄 단지 "대화 상자의 설정 폴더"입니다) 전에 대화 상자의 폴더 속성을 설정하려고 할 때 충돌이 발생합니다.

확실하지 않은 점은 하나의 이상한 점은 file: 뒤에 세 개의 슬래시가 있으며 폴더로 설정하는 경로는 두 개 뿐이라는 점입니다. 나는 여러 가지의 경로 수정을 시도 : -의

  • 예상 종류이다 file:가 완전히 생략 된 경우

    • 을 대화 아마 의미있는 방법으로 주소를 구문 분석하는 데 실패, 기본 위치에서 열립니다 아무리 내가 file: 후 추가하거나 제거 슬래시 얼마나 많은 기대 같은 오류 메시지가 내가 저장하고 다시 할 수있는 날을 이끌만한 조언을 부탁드립니다

    표시된 경로에있는 세 개의 슬래시와 함께 항상 나타납니다 "FileDialog"에서 마지막으로 사용 된 폴더를 "local"및 "local"모두에 사용할 수있는 방법으로 사용합니다. UNC 경로는 비록 우리가 현재 사용하고있는 것과는 다른 방식으로 수행되었다고하더라도.

  • 답변

    2

    Qt에서 오류가있는 것 같습니다. QFileDialog 잘못된 방식으로 URI를 "수정"하십시오. "\ myRemotePC.somewhere.com \ myData \"와 같은 UNC 경로를 URI로 변환하면 "file : //myRemotePC.somewhere.com"/myData ",이 부분은 올바르지 만 QFileDialog에서 볼 때 로컬 폴더를 가져 오려고합니다.

    원시 문자열 또는 URL로 QFileDialog를 공급하려고하지만 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; 
    } 
    } 
    
    +0

    C++ 측에서 대화 상자를 실행하는 것은 아마도 선택 사항이지만 꽤 좋은 방법이지만 더 나은 방법이 있기를 바랍니다. 감사합니다.원격 위치를 드라이브로 연결하면 문제는 해결되지만 문제는 해결되지 않습니다. 네트워크 드라이브를 사용할 때 소프트웨어가 충돌하고 사람들이 네트워크 드라이브를 많이 사용하는 Google 지원팀에 계속 편지를 보냅니다. 경로가 UNC인지 확인해 볼 수는 있지만 UNC가 "기억"하지는 않지만 사용자로부터 약간의 편의를 얻고 있습니다. – tomj

    +0

    하지만 그렇지 않으면 동의합니다. FileDialog가 onFolderChanged 중에 경로의 일종의 변환/수정을 수행하고 있지만 UNC 경로를 고려하지 않은 것 같습니다 ( – tomj

    +0

    ) https : // bugreports. 버그를 제출했습니다. qt.io/browse/QTBUG-63710 –