Мне нужно нарисовать данные пикселей, которые хранятся в библиотеке как uint8_t *
, и которые часто и частично обновляются.Я получаю ответный звонок из библиотеки каждый раз, когда выполняется обновление, которое выглядит следующим образом:
void gotFrameBufferUpdate(int x, int y, int w, int h);
Я пытался создать QImage с использованием указателя данных пикселей
QImage bufferImage(frameBuffer, width, height, QImage::Format_RGBX8888);
и пусть обратный вызов update()
моего виджета
void gotFrameBufferUpdate(int x, int y, int w, int h)
{
update(QRect(QPoint(x, y), QSize(w, h)));
}
, который просто рисует обновленную область QImage через paint()
:
void MyWidget::paint(QPainter *painter)
{
QRect rect = painter->clipBoundingRect().toRect();
painter->drawImage(rect, bufferImage, rect);
}
Проблема с этим подходом заключается в том, что QImage , похоже, не отражает каких-либо обновлений в пиксельном буфере. Он продолжает показывать свое начальное содержимое.
Мой текущий обходной путь - повторное создание экземпляра QImage при каждом обновлении буфера:
void gotFrameBufferUpdate(int x, int y, int w, int h)
{
if (bufferImage)
delete bufferImage;
bufferImage = new QImage(frameBuffer, width, height,
QImage::Format_RGBX8888);
update(QRect(QPoint(x, y), QSize(w, h)));
}
Это работает, но мне кажется очень неэффективным.Есть ли лучший способ справиться с внешне обновляемыми данными пикселей в Qt?Могу ли я сообщить своему QImage об обновлениях его буфера памяти?
(Справочная информация: я пишу пользовательский тип QML с бэкэндом C ++, который должен отображать содержимое сеанса VNC. IДля этого использую LibVNC / libvncclient .)