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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать потерю фокуса окна при скрытии? [РЕШЕНО - Qt 4.5/Win]  (Прочитано 8269 раз)
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« : Сентябрь 12, 2009, 14:04 »

У меня естьокно, основанное на классе  QDialog, к нему "привязан"  QSystemTrayIcon. При клике на последнем вызывается слот, скрывающий или отображающий окно:

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

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

Подскажите, плз, как сделать чтоыб при скрытии фокус автоматически переключался на десктоп/другое окно?
« Последнее редактирование: Сентябрь 14, 2009, 09:26 от DOOMer » Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
SABROG
Гость
« Ответ #1 : Сентябрь 12, 2009, 14:56 »

Пользователь твоей программы наверно повесится, если фокус не перейдет на другое окно...
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #2 : Сентябрь 12, 2009, 15:06 »

SABROG, ну пользовтель может и не повесится. Но во-первых мне интересно -- рельно ли это реализовать на  Win32-платформе, а во -вторых -- данная "фича" мне необходима для полной реализации задуманного функционала.

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

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
SABROG
Гость
« Ответ #3 : Сентябрь 12, 2009, 16:18 »

Это платформо-зависимый код, Qt не может лезть за пределы своего приложения, если другое это не позволяет.
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #4 : Сентябрь 12, 2009, 20:36 »

Т.е необходимо до скрытия окна моего  qt-приложения через WinAPI получать хэндл окна находящегося "за моим" (если таковое есть), и после скрытия моего окна --  передавать другому окну фокус/посылать сообщение?
Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
SABROG
Гость
« Ответ #5 : Сентябрь 12, 2009, 23:01 »

Т.е необходимо до скрытия окна моего  qt-приложения через WinAPI получать хэндл окна находящегося "за моим" (если таковое есть), и после скрытия моего окна --  передавать другому окну фокус/посылать сообщение?
Думаю, что не до скрытия, а до открытия главного виджета.
Записан
С ПРАЗДНИКОМ, ГОСПОДА!!!
Гость
« Ответ #6 : Сентябрь 13, 2009, 20:10 »

А вы не пробывали раскуривать исходники KSnapshot? Думаю проблемы не должно возникнуть, т.е. можно сделать и кросплатформенно)
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #7 : Сентябрь 13, 2009, 20:30 »

А вы не пробывали раскуривать исходники KSnapshot? Думаю проблемы не должно возникнуть, т.е. можно сделать и кросплатформенно)
Естественно я исходники  KSnapshot  "копал". Но там практически всё завязано на  kde-libs. А в каком состоянии KDE под  Wndows --  я даже и не в курсе. Так что вариант с портированием кода KSnapshot  я отмел сразу.

Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
С ПРАЗДНИКОМ, ГОСПОДА!!!
Гость
« Ответ #8 : Сентябрь 13, 2009, 20:45 »

Не наю, может я пьян, но не вижу проблемы... Щас попробую реализовать...

Правда у меня Линь, стоит...
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #9 : Сентябрь 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();
   }
}
« Последнее редактирование: Сентябрь 14, 2009, 00:18 от DOOMer » Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
SABROG
Гость
« Ответ #10 : Сентябрь 14, 2009, 08:34 »

Так речь идет об окнах чужих приложений или только своего?

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

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

Сообщений: 95



Просмотр профиля
« Ответ #11 : Сентябрь 14, 2009, 09:24 »

Так речь идет об окнах чужих приложений или только своего?
Именно об окнах чужих приложений.

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

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
SABROG
Гость
« Ответ #12 : Сентябрь 14, 2009, 09:29 »

Так ведь ты можешь минимизировать свое окно без использования winapi Улыбающийся
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #13 : Сентябрь 14, 2009, 09:52 »

Так ведь ты можешь минимизировать свое окно без использования winapi Улыбающийся
Точно Улыбающийся Вчера у меня как-то вылетело из головы то что можно showMinimized() и showNormal() использовать. Хотя в winapi есть сообщение  SW_RESTORE, передавая которое в ф-цию ShowWindow() можно восстановить окно из панели задач в те размеры, при которых оно было свёрнуто (вдруг пользователь захочет  немного изменить размеры ).

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

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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