Mihail SermjazhkoFeb. 14, 2022, 9:24 a.m.

Мерцание при обновлении картинки в QML

QML, Android, Qt

Добрый день.
Получаю от сервера 10-30 картинок в секунду, вот так преобразовываю

QUrl AppCore::imageToUrl(const QImage &image)
{
    QByteArray byteArray;
    QBuffer buffer(&byteArray);
    buffer.open(QIODevice::WriteOnly);
    image.save(&buffer, "png");
    QString base64 = QString::fromUtf8(byteArray.toBase64());
    return QString("data:image/png;base64,") + base64;
}

и отправляю QUrl в sourse Image. На десктопе все более менее работает, только при обновлении других виджетов может получится мерцание. На андроите получается постоянное мерцание (исчезновение карти, отображение фона, последующее отображение картинки). Скажите пожалуйста, в чем может быть дело и как это можно исправить? Может быть можно перевести картинки в видео и так их отображать в QML?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
9

Добрый день,
Это у вас типо видеострима работает? А покажите кусок кода, где это функция применяется?
Может дело в том, что у вас пустует source пока конвертируется изображение? Я бы в этом случае испускал сигнал с QUrl вместо прямого использования метода. В таком случае можно будет приконнектиться к AppCore и реагировать уже на готовое изображение и только тогда менять source изображения.

Я получаю ответ от сервера с картинкой в виде массива байт и так обрабатываю через Q_PROPERTY

setProperty("iRImageUrl", "data:image/png;base64," + doc.object()["data"].toString());

Так же я пробовал испускать сигнал и передавать полученное значение в QML в source, но мерцание при обновлении сохранилось

emit currentIRImageChanged("data:image/png;base64," + doc.object()["data"].toString());

Я думаю, что вашу проблему мог бы решить QQuickImageProvider

Вполне возможно что все эти мерцания из-за того, что изображение обновляется совместно со всем интерфейсом, а если это сделать через QQuickImageProvider, то там это будет работать более асинхронно, что может решить проблему.

Тем более, что здесь говорится как раз про потоковую передачу изображений в Image объект в QML

The QQuickImageProvider class provides an interface for supporting pixmaps and threaded image requests in QML

Попробовал. Не помогло.
Класс сделал так

class ImageProvider : public QQuickImageProvider
{
public:
    ImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap)
    {
    }

    QPixmap m_pixmap = QPixmap("/home/owner/Загрузки/image_2022-02-04_15-52-48.png");

    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override
    {
        return m_pixmap;
    }
};

В мэйне записал так

engine.addImageProvider(QLatin1String("imageProviderIRImage"),  appCore->m_imageProviderIRImage);

В QML задал источник так

source: "image://imageProviderIRImage"

Но при такой реализации отображается только заданная в классе картинка, оно не обновляется при изменении m_pixmap
m_pixmap меняю так

QByteArray arr = QByteArray::fromBase64(doc.object()["data"].toString().toLatin1());
            m_imageProviderIRImage->m_pixmap.loadFromData(arr);

функция requestPixmap вызфвается только один раз

Думаю, тут посложнее код должен быть, я бы попробовал совместить код из imageToUrl, чтобы заменять картинку в провайдере. Пока у меня только такие мысли есть.

Дело в том,что в провайдере и так меняется картинка, просто похоже это дергается только один раз при вызове в мэйне.

Эммм, может тогда ещё поиграть с настройками самого Image? В документации сказано, что есть следующие свойства:

  • asynchronous - асинхронная загрузка, которая по умолчанию false, кроме изображений из сети.
  • cache - кэширование изображений, которое по умолчанию true, может при изменении изображения в источнике, из-за кеширование не срабатывает?

Я уже не знаю, сейчас разве что только пальцем в небе попаду.

Я сделал сигнал обновления картинки и менял потом source картинки так, в таком случае работает без мерцания

                        imageIrImage.source = "image://imageProviderIRImage/ir"
                        imageIrImage.source = "image://imageProviderIRImage"

Получается, что доколупали.
Решение - QQuickImageProvider + сигнал на обновление. Тоже вариант.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Fornex

Let me recommend you a great European Fornex hosting.

Fornex has proven itself to be a stable host over the years.

For Django projects I recommend VPS hosting

Following the link you will receive a 5% discount on shared hosting services, dedicated servers, VPS and VPN

View Hosting
YL

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
k
  • korsar
  • Nov. 23, 2022, 9:57 a.m.

C++ - Test 005. Structures and Classes

  • Result:50points,
  • Rating points-4
TM

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
Last comments
b

GameDev on Qt - Tutorial 5. The explosion of bullets using sprite images

Если вдруг кто-то прочитает.... Скачал проект, скомпилил, запустил. Всё красиво и объектно ориентировано, но вот FPS дико страдает, когда появляется 10+ врагов. Может есть какие-то надстрой…
  • juvf
  • Nov. 25, 2022, 1:14 a.m.

Qt/C++ - Lesson 051. QMediaPlayer – simple audio player

Добрый день. Подскажите, как можно перехватить в Qt или Qml уровень воспроизводимого звука? Т.е. требуется сделать виртуальный винтажный индикатор (стрелочный или светодиодный), который бы …
  • juvf
  • Nov. 3, 2022, 4:20 a.m.

QML - Lesson 007. ListView. Dynamic creation and deletion of elements

Добрый день. Очень полезная статья. Спасибо. Вопрос такой: 1) нужно "взять" кнопку 2 пальцем (прикаснулись пальцем к кнопке 2, держим, через 2-3 кнопка оторвалась от ListView) и пере…

PyQt5 - Lesson 007. Works with QML QtQuick (Signals and slots)

А можно ли из QML сделать привязку свойства к свойству пайтоновского объекта? Ну, т.е. , например, у нашего объекта Calculator обхвялем свойства sumresult и subresult c с декоратором @pyqtProp…
MA

Python Image Recognition with TensorFlow and Keras

А что собственно выводит программа, как вывести то что она смогла распознать?
Now discuss on the forum
AB

Sorting the added QML elements in the ListModel

I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …
AM

Как добавить в скрипт размер каждого файла в Мб ?

IDLE (Python 3.10 64-bit) Win 10 Есть такой скрипт: Поиск перечня файлов в папке и запись списка: import ospath = 'E:\Мой Python\__Видеокурсы Python'rez = sorted(os.listdir(pa…
n
  • nkly
  • Oct. 18, 2022, 10:14 a.m.

Как сохранить данные древовидной модели на основе QStandardItemModel в файл

Вы меня неправильно поняли. Допустим я собираю кулинарные рецепты и один из них - рецепт супа Харчо. Структура файла данных такова: { node:Рецепт супа Харчо parent:Вкусные блюда, …

Вопрос по Qt Creator

Добрый день. Не знаю, подобную проблему я не решал.

Задать другой класс div-у

Добрый день. Попробуйте использовать Selenium. Это библиотека есть в виде Python модуля и она позволяет загружать страницу и манипулировать html элементами. Как я понимаю, в ней можно…
About
Services
© EVILEG 2015-2022
Recommend hosting TIMEWEB