Назад и вперед между QML Canvas и C ++ - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь реализовать инструмент 'Bucket fill' для холста QML, используя алгоритм заливки.Моя начальная реализация в чистом QML / Javascript работает хорошо, но (как и ожидалось) медленно и по существу непригодна для мобильных устройств.

Я бы хотел вместо этого реализовать ее на C ++.К сожалению, совместное использование содержимого холста QML с C ++ не просто / не поддерживается / не документировано.

Мой текущий подход запутан и, конечно, не эффективен: сначала я сериализирую содержимое холста, используя canvas.dataToUrl("image/bmp"), я передаюИзображение в кодировке base64 для плагина C ++ QML, который выполняет заливку:

void FloodFill::setImageData(const QString &data)
{
    QByteArray base64Data = data.mid(22).toUtf8();

    QImage image;
    image.loadFromData(QByteArray::fromBase64(base64Data), "BMP");

    fill(image);

    emit onCanvasFilled();
}

Затем, при следующей перерисовке холста QML, я получаю доступ к C ++ QImage, перекодируя его в base64 на стороне C ++,и затем использование строки base64 в качестве источника изображения в QML.

В итоге: canvas -> base64 кодирование с помощью toUrlData -> C ++ -> декодирование в QImage -> floodfill -> перекодировать в строку base64 -> декодировать как изображение QML -> закрасить изображение QML поверх холста.

Это явно крайне неэффективно.

В идеале я хотел бы получить доступадрес памяти холста 'CanvasImageData из C ++ для непосредственного редактирования пикселей без какой-либо копии.

Следующим лучшим вариантом будет копирование в обоих направлениях CanvasImageData (нотип C ++ для CanvasImageDataк сожалению, личное).

Любые другие предложения?

(Хочу добавить, что я также посмотрел на интерфейс QImageProvider, но не вижу, как я могу заставить его работатьв этой ситуации, поскольку поставщик изображений должен быть запущен в моем плагине QML, и я не понимаю, как я мог бы тогда зарегистрировать поставщик изображений с помощью механизма QML).

1 Ответ

0 голосов
/ 09 декабря 2018

@ folibis предложение использовать QQuickPaintedItem - это путь, который я в итоге выбрал, и эффективно решить мою проблему - однако, к сожалению, приходится по существу отказаться от объекта холста QML на этом пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...