从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)

Posted

技术标签:

【中文标题】从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)【英文标题】:Reading a line from a .txt or .csv file in qml (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

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

【问题讨论】:

【参考方案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 或其他东西的代码。如果没有这些细节,我无法提供帮助。

以上是关于从 qml 中的 .txt 或 .csv 文件中读取一行(Qt Quick)的主要内容,如果未能解决你的问题,请参考以下文章

在python中读/写字典到csv文件

上传 .csv 或 .txt 文件以填充 QTableView

在 Angular 应用程序中将 json 文件(从 json-server)下载为 txt 或 json 或 csv 文件

从 .csv 写入 txt 文件,但列之间的空间模式不同

在python中读/写txt文件后文件大小发生变化

QML QT导入CSV文件并使用python在Tableview中显示