Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Resager от Январь 23, 2011, 19:48



Название: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: 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();


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: zenden от Январь 23, 2011, 20:43
QTimer спасет отца русской демократии


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: Resager от Январь 23, 2011, 20:51
Как интересно таймер спасёт? Делать отсрочку более чем на полсекунды это крадёт время! Если нужно сделать скрин в текущий момент? Тем более сама процедура у меня работает по таймеру тоже (в зависимости от настроек).


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: lit-uriy от Январь 23, 2011, 21:36
после hide()
QApplication::processEvents() сделай.


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: AlekseyK от Январь 24, 2011, 02:43
или hideEvent() перехватывать.


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: Resager от Январь 24, 2011, 10:37
hideEvent() я перехватывал, эффекта 0.

сделал QCoreApplication::processEvents (QEventLoop::ExcludeUserInputEvents);, заметно что окно скрывается почти на секунду (ну или полсекунды точно). Вот только окно экплорерра не перересовывается или не успевает это делать, но это уже мелочи. Спасибо!


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: SASA от Январь 24, 2011, 12:27
Можно посмотреть QCoreApplication::flush().


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: Vitto74 от Январь 24, 2011, 15:23
Еще можно попробовать сделать окно прозрачным. В некоторых оконных менеджерах, например в моем Linux, при скрытии к окну применяются графические эффекты и его скрытие проходит долго (~200 - 300 мс).


Название: Re: QPixmap::grabWindow - грабит скриншот слишком рано!
Отправлено: Resager от Январь 24, 2011, 20:28
Всё равно либо остаётся на других окнах часть окна, или если делать прозрачность, тогда белый цвет от формы остаётся на других окнах. Чтож, таймер походу единственный вариант. всем спасибо.