LINUX.ORG.RU

сохранить изображение виджета, дождавшись отрисовки суб-виджетов

 , ,


0

1

Есть окно, его содержимое можно легко сохранить при помощи this->grab().save(«my_window.png»);

Проблема: есть несколько суб-виджетов, в них я программно рисую сложные картинки, которые рисуются относительно долго (100 миллисекунд). В итоге сохраняется какой-то обрубок.

Как мне корректно синхронизировать время того, что все виджеты были корректно отрисованы и теперь вот уже можно сохранить всю эту красоту в файл?

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

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Я сам так подумал и начал делать, правда получил рекурсивный repaint, думаю просто мелкая ошибка. Я шлю сигналы когда paint завершился и складирую в бит-карту и когда она заполнена я уже могу грабастать картинку - но означает ли это фактическое появление картинок на виджете? Не хотелось бы писать эту фукнцию зависимой от фазы Луны...

I-Love-Microsoft ★★★★★
() автор топика

А не лучше ли вынести рисование картинок в отдельный поток и обновлять только по завершении (через сигнал-слотовые соединения)?

XMs ★★★★★
()
Ответ на: комментарий от XMs

Если иначе никак - то придется так. Я уже думал об этом, просто придется неслабо перепахать, но что поделаешь :)

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от XMs

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

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

И где он теперь после этого? )))

Мне не нужно оптимизировать эту часть чтоб «не лагала», просто надо как-то понять что «да, рисование завершено, терь можно дёрнуть пикчу» (при помощи widget->grab()).

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Когда добавил painter.end - стало виснуть «recursive repaint detected».

К тому же, означает ли paint.end что картинка уже появилась на основной форме?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Странно. end() должен сигнализировать о том, что отрисовка закончилась. С генерацией кривых изображений помогает. Но видимо с paintEvent не дружит.

А так - генерируем картинку и уже ее показываем. Любой захват результата paintEvent, на моей памяти, приводил к костылям.

RazrFalcon ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Лучше покажи код, и мы напишем всё, что о нём думаем

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.