Russian Qt Forum
Ноябрь 23, 2024, 12:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QML загрузка части изображения на форму по таймеру  (Прочитано 2694 раз)
anm
Гость
« : Ноябрь 17, 2013, 22:22 »

Приветствую всех.
Моя задача - загружать на 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?
Если я на правильном пути, что я делаю неправильно?
« Последнее редактирование: Ноябрь 17, 2013, 22:35 от anm » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 21.