基于QML的文件读写

来源:互联网 发布:ubuntu 列表显示 编辑:程序博客网 时间:2024/05/19 21:01

          最近与群友交流,突然发现我还从来没有在qml中使用本地文件的功能,查阅QML的Text元素,居然没有source这个属性去加载本地的文本文件等,其实js本来也是无法操作io,但是QML有C++作为接口来处理,不知为何没有提供这样的属性,遂研究了一下这个功能。

         既然QML不提供这样的属性和方法,那我们只能从C++入手 自己写个操作文件的类,然后处理文件。

         主要是一个继承QObject的类,下面是代码:

      

#ifndef FILEIO_H#define FILEIO_H#include <QObject>#include <QTextStream>#include <QFile>class FileIO : public QObject{    Q_OBJECTpublic:    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

#include "fileio.h"#include <QFile>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;}
FileIO操作类

之后可以在main函数里面注册这个操作类

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

而QML中则有:

import QtQuick 2.0import FileIO 1.0Rectangle {    width: 300    height: 700    BorderImage {        id: name        source: "background.png"        width: 300; height: 700        border.left: 5; border.top: 5        border.right: 5; border.bottom: 5    }    Text {        id: myText        text: qsTr("中华男儿当自强")        anchors.centerIn: parent        font.pixelSize: 20        color: "white"    }    FileIO {           id: myFile           source: "fileno.txt"           onError: console.log(msg)       }       Component.onCompleted: {           console.log( "WRITE"+ myFile.write("TEST TEST file is OK"));           myText.text =  myFile.read();       }}

   其实很简单 只要你了解QML就可以做到,虽然简单,但是还是再次记录下,以便后来者能够迅速掌握

  最后附上我的github地址:寒山-居士-Github

1 0