Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Август 20, 2018, 16:41



Название: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: billy4685 от Август 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.
Может кто уже реализовывал подобное? Буду рад стоящим идеям.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: Пантер от Август 20, 2018, 16:47
Тебе придется самому реализовывать сохранение.
Может, ну его нафиг прогрессбар?


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: billy4685 от Август 20, 2018, 16:53
Да я уже тоже над этим задумываюсь.  ;D


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: RedDog от Август 20, 2018, 20:25
Даже на самую медленную флешку скриншот запишется настолько быстро, что прогрессбар не успеет появиться.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: Igors от Август 21, 2018, 02:38
Запустить save в др нитке, а в главной по таймеру обновлять прогресс. Процентов конечно не получить, но индикатор будет бегать туда-сюда (если уж "так надо" - необходимость сильно надумана)


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: demal от Август 21, 2018, 10:54
Тогда уж проще просто прогресс бар с нулями в аргументах поставить и он будет бегать туда-сюда


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: deMax от Август 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 секунд.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: deMax от Август 21, 2018, 11:07
Я делал сохранение в память, но мне это для кэша нужно было. А вам прогресс бар для данной задачи совершенно не нужен. ИМХО, как правило меньше 5 секунд прогресс бар смысла не имеет.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: billy4685 от Август 21, 2018, 13:01
Если изображение сохранять на флешку с максимальным качеством, то оно сохраняется довольно таки медленно.
Если же как я указал в примере с малым качеством(40), то сохранит моментально.

Я просто планировал сохранять в наилучшем качестве. Спасибо всем за ответ. Учту все подсказки.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: deMax от Август 21, 2018, 13:23
Если изображение сохранять на флешку с максимальным качеством, то оно сохраняется довольно таки медленно.
Сохраняется оно довольно быстро, просто флешка слишком тормозная(на фоне остальных типов памяти).

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

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


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: billy4685 от Август 21, 2018, 14:38
deMax, благодарю за совет. Так и сделаю.


Название: Re: Как отобразить процесс сохранения QPixmap изображения в файл?
Отправлено: Fregloin от Сентябрь 05, 2018, 11:43
QProgressDialog вам в помощь