【问题标题】:Writing to file doesn’t work in Qt5/Qml写入文件在 Qt5/Qml 中不起作用
【发布时间】:2014-07-10 12:12:09
【问题描述】:

对于我的 QML 项目,我需要一个简单的 IODevice 来处理文件,所以我从 Nokia Dev 获取了这个 但为了我的工作,我稍微调整了一下。 从文件读取就像一个魅力(这证明,没有“文件路径错误”的问题”),但是写入文件被破坏了,我找不到原因。

代码如下:

fileio.h

#ifndef FILEIO_H
#define FILEIO_H

#include <QObject>

class FileIO : public QObject
{
    Q_OBJECT

public:
    explicit FileIO(QObject *parent = 0);

    Q_INVOKABLE QString read(const QString& Url);
    Q_INVOKABLE bool write(const QString& Url, QString data);


public slots:

signals:
    void error(const QString& msg);

private:
    QString mSource;
};

#endif // FILEIO_H

fileio.cpp

#include "fileio.h"
#include <QFile>
#include <QTextStream>

FileIO::FileIO(QObject *parent) :
    QObject(parent)
{

}

QString FileIO::read(const QString& Url)
{
    mSource = Url;
    if (mSource.isEmpty()){
        emit error("source is empty");
        return QString();
    }

    QFile file(mSource);
    QString fileContent;
    if ( file.open(QIODevice::ReadOnly) ) {
        QString line;
        QTextStream t( &file );
        t.setCodec("UTF-8");
        do {
            line = t.readLine();
            fileContent += line;
         } while (!line.isNull());

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



    return fileContent;
}

bool FileIO::write(const QString& Url, QString data)
{
    mSource = Url;
    if (mSource.isEmpty()){
        emit error("source is empty");
        return false;}

        QFile file(mSource);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
            emit error("Error");
            return false;}

        QTextStream out(&file);
        out << data;
        //emit error("data:" + data); //This one was used to debug, Yet no errors were emmited when Write is called


        file.close();

        return true;
}

我需要我的应用程序从外部文件加载设置(我不能使用 QSettings,因为我希望在应用程序未启动时通过外部脚本或文本编辑器让用户访问这些设置)。因此,对于每个设置,我都有一个带有单个 Utf-8 字符串的文件,该文件被加载到 qml 中(smth like

property string interfacecolor1 : myFile.read("://settings/color1");

),它的工作原理。 但我也想更改 qml 中的设置 例如:

TextField{
                id:fieldsurname
                Layout.fillWidth: true
                text: myFile.read("://settings/surname"); //Shows user current setting, works perfectly
                onTextChanged: {console.log(fieldsurname.text); //I just check if textfield behaves as supposed, returns what I expect from it.
myFile.write("://settings/surname", fieldsurname.text); //Write text from textfield (it will be for an embeded platform, so I probably need to change setting every new char)
surname = myFile.read("://settings/surname"); //I write new setting to property from new text from file
console.log(myFile.read("://settings/surname")) //Returns an unchanged string
}
            }

另外忘了提一下,手动编辑文件也可以,设置会相应更改,应用程序会正常运行。

所以问题是:出了什么问题?

Ps:这是this question on qt-project 的副本,但问题被掩盖了,我需要尽快回答。提前致谢。

【问题讨论】:

    标签: c++ qt qml qt5


    【解决方案1】:

    您可以使用QSettings 来保存应用程序的设置:

    QSettings settings("organizationName","applicationName");
    settings.setValue("settings/surname",fieldsurname.text);
    

    或阅读它们:

    surname = settings.value("settings/surname","").toString();
    

    但如果需要使用文件(您可能希望使用文件从其他设备导入设置)您应该注意Qt资源中的文件是只读的。因此,如果要更改文件,应首先将文件复制到某个位置:

    QFile dfile("://settings/surname");
    if (dfile.exists())
    {
         dfile.copy("./surname");
         QFile::setPermissions("./surname",QFile::WriteOwner | QFile::ReadOwner);
    }
    

    【讨论】:

    • 谢谢,您的修复效果很好,现在我可以通过脚本或用户进行设置。
    【解决方案2】:

    Qrc 文件是只读的。你不能给他们写信。您必须将文件放入真正的文件系统并从那里读/写它。

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 2017-04-01
      • 2018-03-27
      • 1970-01-01
      • 2015-08-19
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多