Реализация плагина FileIO
Помните, что API 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();
...
}
Мы опустим свойства, так как они являются простыми сеттерами и геттерами.
Метод 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::write()
{
if(m_source.isEmpty()) {
return;
}
QFile file(m_source.toLocalFile());
if(file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << m_text;
}
}
Чтобы сделать тип видимым для QML, мы добавляем макрос QML_ELEMENT
сразу после строк Q_PROPERTY
. Это сообщает Qt, что тип должен быть доступен для QML. Если вы хотите указать имя, отличное от имени класса C++, вы можете использовать макрос QML_NAMED_ELEMENT
.
Не забудьте в конце вызвать make install
. В противном случае файлы вашего плагина не будут скопированы в папку qml, и движок QML не сможет найти модуль.
Подсказка
Поскольку чтение и запись блокируют вызовы функций, вы должны использовать этот плагин FileIO
только для небольших текстов, иначе вы заблокируете поток пользовательского интерфейса Qt. Имейте в виду!