Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: DOOMer от Сентябрь 12, 2009, 14:04



Название: Как сделать потерю фокуса окна при скрытии? [РЕШЕНО - Qt 4.5/Win]
Отправлено: DOOMer от Сентябрь 12, 2009, 14:04
У меня естьокно, основанное на классе  QDialog, к нему "привязан"  QSystemTrayIcon. При клике на последнем вызывается слот, скрывающий или отображающий окно:

Код
C++ (Qt)
void Dialog::wndHideShow()
{
   if (isHidden())
   {
       show();
   }
   else
   {
       hide();
   }
}

При этом в  Linux приложение отдаётт фокус top-level-оку (если таковое имеется в данный момент на десктопе), или самому рабочему столу.  А вот в  Windows этого не просиходит/

Подскажите, плз, как сделать чтоыб при скрытии фокус автоматически переключался на десктоп/другое окно?


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: SABROG от Сентябрь 12, 2009, 14:56
Пользователь твоей программы наверно повесится, если фокус не перейдет на другое окно...


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: DOOMer от Сентябрь 12, 2009, 15:06
SABROG, ну пользовтель может и не повесится. Но во-первых мне интересно -- рельно ли это реализовать на  Win32-платформе, а во -вторых -- данная "фича" мне необходима для полной реализации задуманного функционала.

Пишу нечто набодобии утилиты  KSnapshot из KDE, но под Windows. Ну и заодно изучаю Qt, т.к. до этого совсем не работал с этим toolkit'ом.


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: SABROG от Сентябрь 12, 2009, 16:18
Это платформо-зависимый код, Qt не может лезть за пределы своего приложения, если другое это не позволяет.


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: DOOMer от Сентябрь 12, 2009, 20:36
Т.е необходимо до скрытия окна моего  qt-приложения через WinAPI получать хэндл окна находящегося "за моим" (если таковое есть), и после скрытия моего окна --  передавать другому окну фокус/посылать сообщение?


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: SABROG от Сентябрь 12, 2009, 23:01
Т.е необходимо до скрытия окна моего  qt-приложения через WinAPI получать хэндл окна находящегося "за моим" (если таковое есть), и после скрытия моего окна --  передавать другому окну фокус/посылать сообщение?
Думаю, что не до скрытия, а до открытия главного виджета.


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: С ПРАЗДНИКОМ, ГОСПОДА!!! от Сентябрь 13, 2009, 20:10
А вы не пробывали раскуривать исходники KSnapshot? Думаю проблемы не должно возникнуть, т.е. можно сделать и кросплатформенно)


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: DOOMer от Сентябрь 13, 2009, 20:30
А вы не пробывали раскуривать исходники KSnapshot? Думаю проблемы не должно возникнуть, т.е. можно сделать и кросплатформенно)
Естественно я исходники  KSnapshot  "копал". Но там практически всё завязано на  kde-libs. А в каком состоянии KDE под  Wndows --  я даже и не в курсе. Так что вариант с портированием кода KSnapshot  я отмел сразу.



Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: С ПРАЗДНИКОМ, ГОСПОДА!!! от Сентябрь 13, 2009, 20:45
Не наю, может я пьян, но не вижу проблемы... Щас попробую реализовать...

Правда у меня Линь, стоит...


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: DOOMer от Сентябрь 13, 2009, 23:13
После некоторого времени копания в MSDN, проблему решил. Всё оказалось вобщем не так уж и сложно. Переписал слот, отвечающий за скрытие/отображение окна. Перед вызовом непосредственно hide() или show() добавил вызов API-функции ShowWindow, получающей хэндл моего окна и параметр минимизации/восстановления.

Код
C++ (Qt)
void Dialog::wndHideShow()
{
   if (isHidden())
   {
#ifdef Q_WS_WIN
       ShowWindow(this->winId(), SW_RESTORE);
#endif
       show();
   }
   else
   {
#ifdef Q_WS_WIN
   ShowWindow(this->winId(), SW_MINIMIZE);
#endif
       hide();
   }
}


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: SABROG от Сентябрь 14, 2009, 08:34
Так речь идет об окнах чужих приложений или только своего?

Код
C++ (Qt)
this->winId();
 

Судя по этому коду только о виджетах своего. Тут даже не нужен winapi тогда.


Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии?
Отправлено: DOOMer от Сентябрь 14, 2009, 09:24
Так речь идет об окнах чужих приложений или только своего?
Именно об окнах чужих приложений.

А this->winId() используется для передачи хэндла своего  окна, чтобы это окно минимизировать, а уже потом скрывать. Если его скрывать сразу, без вызова  API-шной функции, то  фокус на окно чужого приложения автоматически не отдаётся.


Название: Re: Как сделать потерю фокуса окна при скрытии? [РЕШЕНО - Qt 4.5/Win]
Отправлено: SABROG от Сентябрь 14, 2009, 09:29
Так ведь ты можешь минимизировать свое окно без использования winapi :)


Название: Re: Как сделать потерю фокуса окна при скрытии? [РЕШЕНО - Qt 4.5/Win]
Отправлено: DOOMer от Сентябрь 14, 2009, 09:52
Так ведь ты можешь минимизировать свое окно без использования winapi :)
Точно :) Вчера у меня как-то вылетело из головы то что можно showMinimized() и showNormal() использовать. Хотя в winapi есть сообщение  SW_RESTORE, передавая которое в ф-цию ShowWindow() можно восстановить окно из панели задач в те размеры, при которых оно было свёрнуто (вдруг пользователь захочет  немного изменить размеры ).

Хотя это не так критично, и можно сохранять размеры в при сворачивании, а потом ресайзить окно по ним при обратном разворачивании.