# 文件读写实现
请记住,这里要创建的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线程。 被注意!