Приветствую всех.
Моя задача - загружать на QML-форму меньший случайный квадрат-часть большего изображения по таймеру.
Остальной код на C++, поэтому решил таймер и копирование области большого изображения делать в C++-модели. Отображать через QQuickPaintedItem, переопределённый paint() и вызов update() в слоте.
Схема примерно такова:
Таймаут -> ImageGetter в параллельном потоке копирует квадратную область из большого QImage в маленький
-> ImageGetter сигнал
-> ImageSetter слот, содержащий update()
-> Таймаут -> ...
Вот сам paint():
ImageSetter::paint( QPainter *painter )
{
painter -> eraseRect( contentsBoundingRect());
painter -> drawImage( QPoint(0,0), image );
}
Первый раз вызываю update() в конструкторе моего QQuickPaintedItem-класса, как рекомендуется в доках. Регистрирую тип, отображаю на форме:
Rectangle {
width: 500
height: 500
ImageItem {
width: 100
height: 100
}
}
И так он совсем ничего не рисует.
Поэтому для простоты проверки я поместил в paint() другой код и установил таймер на много секунд, и даже убрал второй поток:
ImageSetter::paint( QPainter *painter )
{
painter -> eraseRect( contentsBoundingRect());
painter -> fillRect( contentsBoundingRect(), Color );
}
Сolor объявлен как Q_PROPERTY, который я меняю перед каждым update(). Обязательно ли её объявлять как Q_PROPERTY, я пока не понял, но подозреваю, что да, ведь paint() вызывается из QML-движка.
То есть теперь я по таймеру вызываю слот моего QQuickPaintedItem-класса, в котором меняю значение Color, после чего там же вызываю update(). На экране в окне вижу мой item - квадрат одного цвета, хотя update() при дебаге вызывается. Либо Color не меняется для paint(), точно меняясь на стороне C++, либо update() не перерисовывает item в QML.
Нужно ли объявлять Q_PROPERTY в моём классе, учитывая, что никакого взаимодействия из QML-представления с C++-моделью нет, а есть только детерминированное обновление представления из модели?
На верном ли я пути с точки зрения архитектуры? Возможно, есть более элегантный способ сделать то же самое, например, с помощью шейдеров и вызова таймера прямо из QML (имею ввиду изначальную задачу с копированием части QImage) или использовать JavaScript?
Если я на правильном пути, что я делаю неправильно?