【问题标题】:Reading a line from a .txt or .csv file in qml (Qt Quick)从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)
【发布时间】:2012-01-17 12:23:33
【问题描述】:

我需要在模拟屏幕上显示一个字符串。为此,我应该从现有的 Filename.txt/Filename.csv 文件中读取文本。 text 参数已更新,如下面的代码所示。我需要从文本文件中访问字符串并在 MarqueeText 元素中使用它。 Accessed 字符串应在 MarqueeText 元素的 text 字段中使用。

MarqueeText {
     id:scrolltext
     width: 255
     height: 48
     anchors.verticalCenter: parent.horizontalCenter
     text:   //i need to access the string in text file to be displayed
}

请帮我解决这个问题。谢谢。

【问题讨论】:

    标签: qt text qml


    【解决方案1】:

    按照 wiki 页面阅读有关在 QML 中访问文件的信息。诺基亚维基论坛http://web.archive.org/web/20150227025348/http://developer.nokia.com/community/wiki/Reading_and_writing_files_in_QML

    总结:

    创建自定义 QML 类型,FileIO:

    fileio.h

    #ifndef FILEIO_H
    #define FILEIO_H
    
    #include <QObject>
    
    class FileIO : public QObject
    {
        Q_OBJECT
    
    public:
        Q_PROPERTY(QString source
                   READ source
                   WRITE setSource
                   NOTIFY sourceChanged)
        explicit FileIO(QObject *parent = 0);
    
        Q_INVOKABLE QString read();
        Q_INVOKABLE bool write(const QString& data);
    
        QString source() { return mSource; };
    
    public slots:
        void setSource(const QString& source) { mSource = source; };
    
    signals:
        void sourceChanged(const QString& source);
        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()
    {
        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 );
            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& data)
    {
        if (mSource.isEmpty())
            return false;
    
        QFile file(mSource);
        if (!file.open(QFile::WriteOnly | QFile::Truncate))
            return false;
    
        QTextStream out(&file);
        out << data;
    
        file.close();
    
        return true;
    }
    

    注册新的 QML 类型:

    #include "fileio.h"
    
    Q_DECL_EXPORT int main(int argc, char *argv[])
    {
       ...
        qmlRegisterType<FileIO, 1>("FileIO", 1, 0, "FileIO");
        ...
    }
    

    QML 实际使用情况:

    import QtQuick 1.1
    import FileIO 1.0
    
    Rectangle {
        width: 360
        height: 360
        Text {
            id: myText
            text: "Hello World"
            anchors.centerIn: parent
        }
    
        FileIO {
            id: myFile
            source: "my_file.txt"
            onError: console.log(msg)
        }
    
        Component.onCompleted: {
            console.log( "WRITE"+ myFile.write("TEST"));
            myText.text =  myFile.read();
        }
    }
    

    【讨论】:

    • 感谢您的链接。真的帮了我。是否可以检查文件是何时创建的?是否有一些属性可以说明这一点?
    • QFileInfo::created () 这个函数会给你文件信息。但我希望它仍然取决于底层操作系统。您可以在 FileIO 类中使用此函数来返回所需的数据。
    • 我收到以下错误:“FileIO”进入未注册的命名空间“FileIO”。如何解决这个问题?谢谢
    • @RanjitKumar 请发布完整的错误消息,以及使用 pastebin 或其他东西的代码。如果没有这些细节,我无法提供帮助。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多