2017-10-10 11 views
1

最後に使用したフォルダをqmlのファイルダイアログ(Qtバージョン5.6を使用)に保存します。これは、ローカルファイルを扱うとき十分に機能しますが、UNC形式のパスによって対処リモートコンピュータ上のファイルを使用していないときFileDialogのフォルダをQMLのUNCパスから設定する方法は?

///////////// 
/// 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; 
} 

:私はそれを行う方法は、次のようなurlプロパティlastUsedFolderを持っQSettingsています\\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:の後に3つのスラッシュが付きますが、フォルダとして設定しているパスには2つしかありません。私はさまざまな方法でパスを変更しようとした:

  • file:が完全に省略されている場合、ダイアログがデフォルトの場所にオープンし、おそらく意味のある方法でアドレスの解析に失敗 - 種類の
  • を期待されています関係なく、私はfile:後に追加または削除スラッシュどのように多くの楽しみ、同じエラーメッセージは、私が保存し、再できることを私につながる何かアドバイスをいただければ幸いです

示すパスに3つのスラッシュで常に表示されません - 最後に使用したフォルダをFileDialog内で、「ローカル」と「ローカル」の両方で使用できる方法で使用するたとえそれが現在使用されている方法とは異なる方法で実行されたとしても、UNCパスを使用することができます。

答えて

2

Qtからのエラーと思われます。 QFileDialog URIを「正しく」修正しようとすると、「\ myRemotePC.somewhere.com \ myData」のようなUNCパスをURIに変換すると、「file://myRemotePC.somewhere.com」というURIが返されます/ myData "、この部分は正しいですが、QFileDialogの観点からは、ローカルフォルダを取得しようとします。

QFileDialogに生の文字列またはURLを入力しようとしましたが、QFileDialogはパスの変換を継続します。

回避策が必要な場合は、C++からQFileDialogを呼び出すと、UNCパスのような文字列パスで動作します。

もう1つの回避策として、外部ドライブをネットワークドライブとして接続してください。

私の下手な英語のため申し訳ありません^^

誰かが高速な試みをしたい場合。

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++側からダイアログを実行するのはおそらくオプションですが、かなり醜いものですが、より良い方法があると思いますが、ありがとうございます。リモートドライブをドライブとして接続してもクラッシュする問題は解決されません。ネットワークドライブを使用するとソフトウェアがクラッシュするという私たちのサポートに書き留めています(私の分野では、ネットワークドライブを多く使用しています)。私は、パスがUNCであるかどうかを確認して、それが「記憶」されていないかどうかを確認することができますが、それはユーザーから少し利便性があります。 – tomj

+0

しかし、そうでなければ、FileDialogがonFolderChangedの間にある種の変換/修正を行っているようですが、UNCパスを考慮していないようです。( – tomj

+0

https:// bugreportsというバグを投稿しました。 qt.io/browse/QTBUG-63710 –

関連する問題