Название: Как сделать потерю фокуса окна при скрытии? [РЕШЕНО - Qt 4.5/Win] Отправлено: DOOMer от Сентябрь 12, 2009, 14:04 У меня естьокно, основанное на классе QDialog, к нему "привязан" QSystemTrayIcon. При клике на последнем вызывается слот, скрывающий или отображающий окно:
Код
При этом в 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, получающей хэндл моего окна и параметр минимизации/восстановления.
Код
Название: Re: [Qt 4.5 - Win] Как сделать потерю фокуса окна при скрытии? Отправлено: SABROG от Сентябрь 14, 2009, 08:34 Так речь идет об окнах чужих приложений или только своего?
Код
Судя по этому коду только о виджетах своего. Тут даже не нужен 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() можно восстановить окно из панели задач в те размеры, при которых оно было свёрнуто (вдруг пользователь захочет немного изменить размеры ).Хотя это не так критично, и можно сохранять размеры в при сворачивании, а потом ресайзить окно по ним при обратном разворачивании. |