Russian Qt Forum
Ноябрь 26, 2024, 00:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter отмена(Ctrl + Z)  (Прочитано 5532 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Март 30, 2012, 08:38 »

Всем, доброе утро. Есть софтина, местами похожая на Paint, ну то есть предоставляет пользователю возможность рисования. Что бы не возникало проблем с потоками и рисовать можно было бы не только в paintEvent в качестве поверхности для рисования используется QImage.

Код:
QImage img;
QPainter p(&img);

Возникла необходимость дать пользователю возможность отменять действия по нажатию Ctrl + Z, самое банальное что я придумал, это перед началом нового рисования, записывать текущий QImage в QList ,а при отмене перерисовывать последний QImage. Это работает, и  работает достаточно неплохо. Есть одно но, слишком много отъедает оперативной памяти. Ну например кликах при 200, запросто может съесть 700метров. Возникает вопрос, а как можно еще реализовать данный механизм или можно записывать что то другое, что по размеру меньше чем QImage?
Записан
Bepec
Гость
« Ответ #1 : Март 30, 2012, 08:46 »

Сохранять последние 30 действий?
Сохранять Image в файлы?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Март 30, 2012, 08:59 »

про 30ть действий думал уже, был запасным вариантом ))) С файлами наверное долго будет работать.
Записан
Bepec
Гость
« Ответ #3 : Март 30, 2012, 09:11 »

Есть конечно извращенский вариант...

Сделать сериализацию действий пользователя в виде вектора действий. И соответственно необходимо написать десериализатор.
Записан
BRE
Гость
« Ответ #4 : Март 30, 2012, 09:11 »

А ты картинки сжимай в памяти и храни сжатые. Как правило они очень хорошо жмутся.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Март 30, 2012, 09:22 »

BRE, это как то так

псевдокод, на коленке пишу

Код:
QByteArray data;
QBuffer buff(data);
QImage img;
img.save(&buff,"PNG");
buff.close();

QByteArray data = qCompress(data, 7);

а последний байт аррей пишем в лист, для отката.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 30, 2012, 09:36 »

А чем не устроил QGraphicsView?
Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Март 30, 2012, 09:38 »

А ку пикча не для этого ли сделана?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Март 30, 2012, 09:48 »

про QGraphicsView чет даже не подумал, насколько на нем будет быстрее отрисовка, и есть ли ф-йии отмены? ну то есть насколько будет целесообразно переписать под него?

QPicture, наверное сделан для этого, но пока не вижу разницы, между записью QImage в QByteArray и в список, или тоже самое делать с QPicture.
Записан
BRE
Гость
« Ответ #9 : Март 30, 2012, 09:51 »

BRE, это как то так

псевдокод, на коленке пишу
Не обязательно сохранять в буфер (хотя и этого может оказаться достаточным), ты можешь получить указатель на распакованные данные и их длину для qCompress:
const uchar * QImage::constBits () const
int QImage::byteCount () const
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #10 : Март 30, 2012, 09:54 »

попробовал с QCompress разница есть, теперь отъедает где то 300 метров Улыбающийся 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Март 30, 2012, 10:05 »

про QGraphicsView чет даже не подумал, насколько на нем будет быстрее отрисовка, и есть ли ф-йии отмены? ну то есть насколько будет целесообразно переписать под него?
Скорость, может даже будет быстрее, т.к. работать придётся с векторными примитивами, а не с растром. Да и по памяти будет громадный выигрыш. К тому же там уже есть возможность выделения и многое другое. Кстати, как ты будешь, если понадобится, масштабировать растр? Ведь будут потери?
Undo/redo там нет, но слепить очередь из QGraphicsItem элементарно.

Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.