FileIO实现(FileIO Implementation)

FileIO实现很简单。记住编程接口我们想要创建的像这样。

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();
    ...
}

我们将保留属性,因为它们是简单的设置者和获取者。

读取方法在读取模式下打开一个文件并且使用一个文本流读取数据。

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

当文本变化时,使用emit textChanged(m_text)需要通知其它对象这个变化。否则属性绑定无法工作。

写入方法相同,但是在写入模式下打开文件,使用文本流写入内容。

void FileIO::write()
{
    if(m_source.isEmpty()) {
        return;
    }
    QFile file(m_source.toLocalFile());
    if(file.open(QIODevice::WriteOnly)) {
        QTextStream stream(&file);
        stream << m_text;
    }
}

最后不要忘记调用make install。否则你的插件文件不会拷贝到qml文件夹,qml引擎无法定位模块。

由于读取和写入会阻塞程序运行,你只能使用FileIO处理小型文本,否则会阻塞Qt的UI线程运行。这里一定要注意!