Qt - Почему не удается прочитать файл, используя QFile с каталогом, который получают из FileDialog? - PullRequest
1 голос
/ 02 апреля 2019

Я читаю файл на Qt 5.12, используя QFile.Я пытаюсь прочитать файл с моего компьютера, но когда я использую каталог, который читает из FileDialog, имеет префикс «file: ///».Может кто-нибудь сказать мне, почему это неправильно и как использовать URL, который получает форму FileDialog, пожалуйста?

Спасибо!

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();
}

Ответы [ 2 ]

4 голосов
/ 02 апреля 2019

FileDialog возвращает 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)
1 голос
/ 02 апреля 2019

Вы должны удалить префикс файла, чтобы использовать URL, который получает форму FileDialog:

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})/,"");
}
...