web-dev-qa-db-ja.com

QFileはfile:/// URLパス形式を認識しません

Qmlから次のようにファイルパスを取得します。

mainView.projectFilePath = Qt.resolvedUrl(newProjectFileDlg.fileUrl).toString();

上記のファイルパスは次のようになります:file:/// C:/uuuu.a3

しかし、このパスがQFileに渡されると、文句を言います

The filename, directory name, or volume label syntax is incorrect

この問題を解決する方法は?

17
Dean Chen

QStringは、正規のURL表現を目的としたものではありません。これは、主にutfのユースケースのために存在する文字列クラスです。

あなたが探しているのは、このようなユースケースのために意図されたQUrlです。そのパスを渡し、そこから「QFileで読み取り可能な」パスを取得して、QFileに渡します。

QFileにパスを渡す前に、変換に次の方法を使用する必要があります。

QUrl QUrl :: fromLocalFile(const QString&localFile)[static]

ローカルファイルとして解釈されるlocalFileのQUrl表現を返します。この関数は、スラッシュで区切られたパスと、このプラットフォームのネイティブセパレーターを受け入れます。

この関数は、「// servername/path/to/file.txt」のように、リモートファイルを示すために先頭にスラッシュ(または円記号)が2つ付いたパスも受け入れます。 QFile :: open()を使用して実際にこのファイルを開くことができるのは、特定のプラットフォームのみであることに注意してください。

13
lpapp
QUrl url(newProjectFileDlg.fileUrl);
url.toLocalFile();

これはおそらくあなたが必要とするものです。あなたの場合、それは「C:/uuuu.a3」を返します。

26
claudiub

QMLにこのようなものがないのはなんて迷惑なことでしょう。 QMLから呼び出すことができるヘルパー関数を作成しました。

Q_INVOKABLE QString convertUrlToNativeFilePath(const QUrl& urlStylePath) const;

これは単にこれを行います:

QString OurClassName::convertUrlToNativeFilePath(const QUrl& urlStylePath) const
{
    return QDir::toNativeSeparators(urlStylePath.toLocalFile());
}
4
gremwell