# 文件读写实现

请记住,这里要创建的FileIO的API应该如下所示:

class FileIO : public QObject {
    ...
    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
    ...
public:
    Q_INVOKABLE void read();
    Q_INVOKABLE void write();
    ...
}

这里将省略属性的描述,因为它们仅仅是简单的setter和getter。

read方法以阅读模式打开文件并使用文本流读取数据。

void FileIO::read()
{
    if(m_source.isEmpty()) {
        return;
    }
    QFile file(m_source.toLocalFile());
    if(!file.exists()) {
        qWarning() << "Does not exist: " << m_source.toLocalFile();
        return;
    }
    if(file.open(QIODevice::ReadOnly)) {
        QTextStream stream(&file);
        m_text = stream.readAll();
        emit textChanged(m_text);
    }
}

当文本更改时,有必要使用emit textChanged(m_text)通知其它相关的更改。 否则,属性绑定将没什么作用。

write方法有相同的作用,但以写入模式打开文件并使用流写入text属性的内容。

void FileIO::read()
{
    if(m_source.isEmpty()) {
        return;
    }
    QFile file(m_source.toLocalFile());
    if(!file.exists()) {
        qWarning() << "Does not exist: " << m_source.toLocalFile();
        return;
    }
    if(file.open(QIODevice::ReadOnly)) {
        QTextStream stream(&file);
        m_text = stream.readAll();
        emit textChanged(m_text);
    }
}

为了使该类型对QML可见,在Q_PROPERTY之后添加了QML_ELEMENT宏。 这告诉Qt,该类型应该让QML可用。 如果要提供与C++类名不同的名称,可以使用QML_NAMED_ELEMENT宏。

TODO

最后,不要忘记调用make install。 否则,插件文件将不会被复制到qml文件夹中,同样qml引擎将无法找到该模块。

TODO

提示

由于读写都是对阻塞函数的调用,应该只对小文本使用这个FileIO,否则会阻塞Qt的UI线程。 被注意!

最后更新: 2/10/2022, 8:12:32 PM