Реализация плагина FileIO

Добавлено 15 мая 2022 в 07:03

Помните, что 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. Имейте в виду!

Теги

C++ / CppGUI / Графический интерфейс пользователяQMLQtQtQuickПлагин / PluginПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.