Вызов QQuickPaintedItem::update() в рабочем потоке не перерисовывалсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вызов QQuickPaintedItem::update() в рабочем потоке не перерисовывался

Сообщение Anonymous »


Использование Qt 5.15 с QML, C++.

Привет. Я работаю над своим собственным типом QML, который наследует класс QQuickPaintedItem.
В первой реализации изображение, которое нужно отрисовать, генерируется в методе paint, и это работает хорошо. Следующий код — моя первая простая реализация.

класс MyType: public QQuickPaintedItem { публика: // Вызовите эту функцию, когда изображение необходимо перерисовать недействительный NeedToDraw() { QQuickPaintedItem::update(); } void Paint(QPainter* Painter) переопределить { __PrepareImage(&изображение_); художник->drawImage(QPoint(0, 0), image_); } частный: // Генерируем @image __PrepareImage (изображение QImage*); частный: QImage image_; }; В этом коде основной поток (GUI) заблокирован до тех пор, пока не будет выполнен PrepareImage(). Проблема возникает, когда вызов PrepareImage() занимает много времени.
Поэтому я создал рабочий поток для подготовки изображения (это нормально, если изображения обновляются немного поздно). Следующий код — это то, что я хочу реализовать.

класс MyType: public QQuickPaintedItem { публика: // Вызовите эту функцию, когда изображение необходимо перерисовать недействительный NeedToDraw() { if (thread_ != nullptr && thread_->isRunning()) return; thread_ = QThread::create(__PrepareImage, this, &image_); поток_-> старт(); } void Paint(QPainter* Painter) переопределить { художник->drawImage(QPoint(0, 0), image_); } частный: // Генерируем @image и вызываем @QQuickPaintedItem::update __PrepareImage(изображение QImage*) { // Генерирует изображение QQuickPaintedItem::update(); } частный: QThread thread_ = nullptr; QImage image_; }; Единственное, что изменилось, — это вызов update() внутри рабочего потока, но он не отрисовывался; thread_ работал, но переопределенный метод paint() никогда не вызывался.
Не удалось найти упоминания о вызове update() в многопоточной документации Qt. Как я могу правильно вызвать update() в рабочем потоке?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»