Мне нужно нарисовать пиксельные данные, которые хранятся в библиотеке как 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. Я использую LibVNC / libvncclient для этого.)
QImage
должен был бы сделать, если бы ему сказали, что его буфер памяти был изменен - ему пришлось бы выбросьте все и воссоздайте себя заново. Так в чем проблема? - person Jesper Juhl   schedule 26.04.2019QImage
, похоже, что QImage сохраняет указатель uchar, предоставленный конструктору, а не делает копию во внутренний буфер. - person Jeremy Friesner   schedule 26.04.2019