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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPixmap::grabWindow - грабит скриншот слишком рано!  (Прочитано 6679 раз)
Resager
Гость
« : Январь 23, 2011, 19:48 »

Есть у меня такая задача, скрыть окно, снять с него скриншот, затем окно показать (логично, цель одна - чтобы окно не попало на скрин). Предположил, что окно неуспевает скрыться, делаю до него мэсэч бокс, на скрине остаётся мэсэчбокс. который вызывается до снятия скрина (может тоже неуспевает скрыться.. незнаю). Потом я вообще решил засунть кусок кода снятия скрина в hideevent функцию, но и там окно на скрине всё равно! Не подскажете, в чём может быть проблема?

Код:
ui->hide();
 qDebug() << "hide win! no minimize" << hidemainwindowforscreen;
        originalPixmap = QPixmap(); // clear image for low memory situations on embedded devices.
        originalPixmap = QPixmap::grabWindow(QApplication::desktop()->screen(2)->winId(),ui->CB_coorx_x1->value(),ui->CB_coorx_y1->value(),ui->CB_coorx_x2->value(),ui->CB_coorx_y2->value()); //
        saveScreenshot(); // функция сохраняет в файл скриншот
ui->show();
Записан
zenden
Гость
« Ответ #1 : Январь 23, 2011, 20:43 »

QTimer спасет отца русской демократии
Записан
Resager
Гость
« Ответ #2 : Январь 23, 2011, 20:51 »

Как интересно таймер спасёт? Делать отсрочку более чем на полсекунды это крадёт время! Если нужно сделать скрин в текущий момент? Тем более сама процедура у меня работает по таймеру тоже (в зависимости от настроек).
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Январь 23, 2011, 21:36 »

после hide()
QApplication::processEvents() сделай.
Записан

Юра.
AlekseyK
Гость
« Ответ #4 : Январь 24, 2011, 02:43 »

или hideEvent() перехватывать.
Записан
Resager
Гость
« Ответ #5 : Январь 24, 2011, 10:37 »

hideEvent() я перехватывал, эффекта 0.

сделал QCoreApplication::processEvents (QEventLoop::ExcludeUserInputEvents);, заметно что окно скрывается почти на секунду (ну или полсекунды точно). Вот только окно экплорерра не перересовывается или не успевает это делать, но это уже мелочи. Спасибо!
Записан
SASA
Гость
« Ответ #6 : Январь 24, 2011, 12:27 »

Можно посмотреть QCoreApplication::flush().
Записан
Vitto74
Гость
« Ответ #7 : Январь 24, 2011, 15:23 »

Еще можно попробовать сделать окно прозрачным. В некоторых оконных менеджерах, например в моем Linux, при скрытии к окну применяются графические эффекты и его скрытие проходит долго (~200 - 300 мс).
Записан
Resager
Гость
« Ответ #8 : Январь 24, 2011, 20:28 »

Всё равно либо остаётся на других окнах часть окна, или если делать прозрачность, тогда белый цвет от формы остаётся на других окнах. Чтож, таймер походу единственный вариант. всем спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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