Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Октябрь 19, 2012, 09:58



Название: Отследить что окно(QWidget) скрылось
Отправлено: ecspertiza от Октябрь 19, 2012, 09:58
Про всякие там isVisible() я уж конечно вкурсе :) Есть следующая проблема например у юзверя стоит винда и он использует тему aero, естественно окна со свистелками\пирделками сворачиваются и разворачиваются. Но возникает вопрос как отловить конец анимации окна ? То есть мне нужен функционал примерно такой, показать окно только после того как первое свернулось, причем полностью, расчитать время анимации я конечно же не могу, может там еще какая шайтан тема стоять будет, где окно в два раза дольше сворачивается. QWidget::isVisible() возвращает false сразу после того как вызвали QWidget::hide(). Вот и возникает вопрос как отловить что окна не видно на экране ? Я попробовал извратиться и сделать так

Код:
    mainwindow->hide();
    QEventLoop loop;
    while(mainToolWidget()->isVisible()) {}
    QTimer::singleShot(0,&loop,SLOT(quit()));
    loop.exec();
    needwindow->show();

но стало быть это и не работает как раз из за isVisible.



Название: Re: Отследить что окно(QWidget) скрылось
Отправлено: Bepec от Октябрь 19, 2012, 10:21
Без платформозависимого кода - никак.

Насколько я помню, свистелки-перделки дело рук оконного менеджера. Соответственно поймать момент скрытия без платформозависимого кода нельзя.

PS есть так же интересные прожки типа доп рабочих столов. Когда окно вроде скрыто, а на другом столе спокойно стоит :D


Название: Re: Отследить что окно(QWidget) скрылось
Отправлено: Serr500 от Октябрь 19, 2012, 11:23
показать окно только после того как первое свернулось
Это так необходимо?
Соответственно поймать момент скрытия без платформозависимого кода нельзя.
Там и платформозависимым ловить нечего. Насколько мне известно, винда не сообщает о запуске/завершении анимации окна. Максимум что можно сделать - вычитать из реестра время сворачивания/разворачивания и сделать задержку.


Название: Re: Отследить что окно(QWidget) скрылось
Отправлено: ecspertiza от Октябрь 19, 2012, 11:35
Это так необходимо?

Да, программа делает скрин с экрана, и если вызвать функцию скрина из главного окна, то половина окна видна на скрине, это как то совсем не гуд :) Мысль с задержкой кажется не плохой, но откуда из реестра можно прочитать инфу о скорости анимации ?


Название: Re: Отследить что окно(QWidget) скрылось
Отправлено: Serr500 от Октябрь 19, 2012, 12:45
ХЗ где она там. Не могу сказать. Я бы поставил твикер типа TuneUp, поменял значение, а затем посмотрел бы, что изменилось в реестре.


Название: Re: Отследить что окно(QWidget) скрылось
Отправлено: Bepec от Октябрь 19, 2012, 13:11
В принципе можно порыскать по реестрам и функциям.
Месяца 2 назад натыкался в интернете на компонент, реализующий красивый уход с экрана с winApi - мб там что то такое и было. В общем поищу.

update: нашёл, правда там использовался мини-костыль. Точнее аналогия с winApi.

Интересный факт: При нажатии иконки свернуть всё, все окна сворачиваются без анимации.

Полезный факт: по заверениям той темы, windows передвигает desktop вверх на его размер, затем вызывая minimize у окон.

Вывод: если не получится сделать как хочется(узнать время сворачивания), можно сделать костылёк - двигать окно за пределы экрана, делать скриншот, минимизировать.