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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPixmap::grabWindow - грабит скриншот слишком рано!  (Прочитано 6792 раз)
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.036 секунд. Запросов: 20.