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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отобразить процесс сохранения QPixmap изображения в файл?  (Прочитано 6360 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Август 20, 2018, 16:41 »

Здравствуйте, господа форумчане.

Пишу приложение ScreenShot экрана. В ОС Windows это выглядит так:
Код:
void screenShot()
{
QString image_str = "screenshot.png";
QWidget *desktop_w = QApplication::desktop();
WId w = desktop_w->winId();

QScreen *screen = QApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(w, 0, 0, desktop_w->width(), desktop_w->height());

if(image_str .isNull())
    return;

if(pixmap.save(image_str , "PNG", 40) == false)
    {
        QFile(image_str ).remove();
    }
}
Появилась необходимость отобразить сам процесс сохранения изображения в виде QProgressBar-а
с бегущими процентами. Но пока не могу понять как это реализовать. Разве что написать свой класс
c QPixmap-а с измененным методом save.
Может кто уже реализовывал подобное? Буду рад стоящим идеям.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 20, 2018, 16:47 »

Тебе придется самому реализовывать сохранение.
Может, ну его нафиг прогрессбар?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #2 : Август 20, 2018, 16:53 »

Да я уже тоже над этим задумываюсь.  Смеющийся
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #3 : Август 20, 2018, 20:25 »

Даже на самую медленную флешку скриншот запишется настолько быстро, что прогрессбар не успеет появиться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 21, 2018, 02:38 »

Запустить save в др нитке, а в главной по таймеру обновлять прогресс. Процентов конечно не получить, но индикатор будет бегать туда-сюда (если уж "так надо" - необходимость сильно надумана)
Записан
demal
Чайник
*
Offline Offline

Сообщений: 53


Просмотр профиля
« Ответ #5 : Август 21, 2018, 10:54 »

Тогда уж проще просто прогресс бар с нулями в аргументах поставить и он будет бегать туда-сюда
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Август 21, 2018, 11:02 »

Даже на самую медленную флешку скриншот запишется настолько быстро, что прогрессбар не успеет появиться.
С 8 мониторов ultrahd на которых нарисованны котики недающие пожать png в пару киллобайт? на глючную флешку 1 Мб/сек?

Сохраните в память, а потом с прогрессбаром на диск. (Из документации bool QPixmap::save(QIODevice *device, const char *format = nullptr, int quality = -1) const )
Код:
          QPixmap pixmap;
          QByteArray bytes;
          QBuffer buffer(&bytes);
          buffer.open(QIODevice::WriteOnly);
          pixmap.save(&buffer, "PNG");

А потом с прогрессбаром на диск, и желательно расчитать оптимальный размер блока. Хотя по правде говоря прогресс бар даже не появиться, оптимальнее показать сообщние "Сохраняется" которое тут же будет заменяно "Сохранено" и скрыто через 5 секунд.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Август 21, 2018, 11:07 »

Я делал сохранение в память, но мне это для кэша нужно было. А вам прогресс бар для данной задачи совершенно не нужен. ИМХО, как правило меньше 5 секунд прогресс бар смысла не имеет.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #8 : Август 21, 2018, 13:01 »

Если изображение сохранять на флешку с максимальным качеством, то оно сохраняется довольно таки медленно.
Если же как я указал в примере с малым качеством(40), то сохранит моментально.

Я просто планировал сохранять в наилучшем качестве. Спасибо всем за ответ. Учту все подсказки.
« Последнее редактирование: Август 21, 2018, 13:08 от billy4685 » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Август 21, 2018, 13:23 »

Если изображение сохранять на флешку с максимальным качеством, то оно сохраняется довольно таки медленно.
Сохраняется оно довольно быстро, просто флешка слишком тормозная(на фоне остальных типов памяти).

Если же как я указал в примере с малым качеством(40), то сохранит моментально.
Ну да, если в буфер флешки влезет картинка, то "сохранено" будет мгновенно(только если флешку выдрать или свет рубануть, там её не будет).

В идеале, сделайте сохранение в другом потоке(Сохранение в память и прогресс бар имхо лишние), прогресс бар на сохранение скриншота в вызывает улыбку.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #10 : Август 21, 2018, 14:38 »

deMax, благодарю за совет. Так и сделаю.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #11 : Сентябрь 05, 2018, 11:43 »

QProgressDialog вам в помощь
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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