Qt - 为什么无法使用带有从 FileDialog 获取的目录的 QFile 读取文件?

Qt - Why unable read file using QFile with directory which get from FileDialog?

我正在使用 QFile 在 Qt 5.12 上读取文件。我尝试从我的计算机读取文件,但是当我使用从 FileDialog 读取的目录时,它有 "file:///" 前缀。谁能告诉我为什么它是错误的以及如何使用从 FileDialog 获取的 URL?

谢谢!

QFile file("C:/Users/HuuChinhPC/Desktop/my_txt.txt"); // this work
//QFile file("file:///C:/Users/HuuChinhPC/Desktop/my_txt.txt"); //didn't work
QString fileContent;
if (file.open(QIODevice::ReadOnly) ) {
    QString line;
    QTextStream t( &file );
    do {
        line = t.readLine();
        fileContent += line;
     } while (!line.isNull());

    file.close();
} else {
    emit error("Unable to open the file");
    return QString();
}

FileDialog returns a url 因为在 QML 中使用了这种类型的数据,但 QFile 不是,所以你必须将 QUrl 转换为使用过的字符串 toLocalFile():

Q_INVOKABLE QString readFile(const QUrl & url){
    if(!url.isLocalFile()){
        Q_EMIT error("It is not a local file");
        return {};
    }
    QFile file(url.toLocalFile());
    QString fileContent;
    if (file.open(QIODevice::ReadOnly) ) {
        QString line;
        QTextStream t( &file );
        do {
            line = t.readLine();
            fileContent += line;
         } while (!line.isNull());
        file.close();
        return fileContent;
    } else {
        Q_EMIT error("Unable to open the file");
        return {};
    }
}

*.qml

var text = helper.readFile(fileDialog.fileUrl)
console.log(text)

您必须去除文件前缀才能使用从 FileDialog:

获取的 URL
QFile file("file:///C:/Users/HuuChinhPC/Desktop/my_txt.txt")
if (Qt.platform.os === "windows") {
    return file.replace(/^(file:\/{3})|(file:)|(qrc:\/{3})|(http:\/{3})/,"")
}
else {
    return file.replace(/^(file:\/{2})|(qrc:\/{2})|(http:\/{2})/,"");
}