FileIO实现(FileIO Implementation)

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

  1. class FileIO : public QObject {
  2. ...
  3. Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
  4. Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
  5. ...
  6. public:
  7. Q_INVOKABLE void read();
  8. Q_INVOKABLE void write();
  9. ...
  10. }

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

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

  1. void FileIO::read()
  2. {
  3. if(m_source.isEmpty()) {
  4. return;
  5. }
  6. QFile file(m_source.toLocalFile());
  7. if(!file.exists()) {
  8. qWarning() << "Does not exits: " << m_source.toLocalFile();
  9. return;
  10. }
  11. if(file.open(QIODevice::ReadOnly)) {
  12. QTextStream stream(&file);
  13. m_text = stream.readAll();
  14. emit textChanged(m_text);
  15. }
  16. }

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

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

  1. void FileIO::write()
  2. {
  3. if(m_source.isEmpty()) {
  4. return;
  5. }
  6. QFile file(m_source.toLocalFile());
  7. if(file.open(QIODevice::WriteOnly)) {
  8. QTextStream stream(&file);
  9. stream << m_text;
  10. }
  11. }

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

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