Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Einior от Июнь 15, 2010, 09:35



Название: Перенос фокуса на приложение.
Отправлено: Einior от Июнь 15, 2010, 09:35
Есть 3 приложения, 1 сервер и 2 клиента.
В начальном положении активно окно сервера (т.е. оно находится на первом плане). По получению некоторого сообщения от клиента, сервер должен вывести окно этого клиента на первый план (либо сам клиент по получению некоторого ответа от сервера стать поверх других окон). Как это можно реализовать? В документации видел информацию только про перевод фокуса между виджетами одного приложения.
Спасибо.


Название: Re: Перенос фокуса на приложение.
Отправлено: cya-st от Июнь 15, 2010, 15:20
В винде смотри функции FindWindow, SetForegraundWindow, SetFocus


Название: Re: Перенос фокуса на приложение.
Отправлено: Einior от Июнь 15, 2010, 17:36
Ммм? В винде? А силами кьют это не сделать?


Название: Re: Перенос фокуса на приложение.
Отправлено: sendevent от Июнь 15, 2010, 17:45
мож, стоит глянуть на QWidget::raise (http://doc.trolltech.com/4.6/qwidget.html#raise)/QWidget::activateWindow (http://doc.trolltech.com/4.6/qwidget.html#activateWindow), но им, вроде как, надо чтобы приложение было активным изначально.
кроме того, "при получении некоторого сообщения" на клиенте можно поиграть с флагами его главного окна - наверно, самый действенный способ "залезть поверх всех".


Название: Re: Перенос фокуса на приложение.
Отправлено: Einior от Июнь 15, 2010, 18:44
Первый способ не работает. Второй, в принципе тоже. Нашёл флаг Qt::WindowStaysOnTopHint, однако, когда ставлю приложению этот флаг, то его окно исчезает в никуда.


Название: Re: Перенос фокуса на приложение.
Отправлено: sendevent от Июнь 15, 2010, 19:12
raise|activate можно комбинировать, вызов актуален в пределах активного приложения (когда пользователь работает именно с ним, а не лазиет в интернете/смотрит кино/держит открытым модальный диалог из этого же приложения и т.п.) - иначе все очень платформо-/DE-зависимо.
второй способ тоже работает - при смене флагов надо явно вызывать show():
Цитата: QAss
windowFlags : Qt::WindowFlags
Window flags are a combination of a type (e.g. Qt::Dialog) and zero or more hints to the window system (e.g. Qt::FramelessWindowHint).

If the widget had type Qt::Widget or Qt::SubWindow and becomes a window (Qt::Window, Qt::Dialog, etc.), it is put at position (0, 0) on the desktop. If the widget is a window and becomes a Qt::Widget or Qt::SubWindow, it is put at position (0, 0) relative to its parent widget.

Note: This function calls setParent() when changing the flags for a window, causing the widget to be hidden. You must call show() to make the widget visible again.
но возня с флагами - некрасивое решение, наверно, лучше вывести какую-нить нотификацию через трей/месседж бокс - смотря по специфике задач, решаемых клиентами.


Название: Re: Перенос фокуса на приложение.
Отправлено: Einior от Июнь 15, 2010, 19:41
Да, с флагами получается что-то, но получается не очень красиво. Нашёл на форуме, что сделать можно с помощью вызова

AllowSetForegroundWindow(ASFW_ANY);

Как я понял, это функция WinAPI, однако я не совсем понимаю как такие функции использовать в Qt. Например, если просто вставить код с этой функцией, то комплиятор выдаёт ошибку о том, что такая функция и её параметр не объявлены. Возможно, нужно подключить какие-то библиотеки?


Название: Re: Перенос фокуса на приложение.
Отправлено: sendevent от Июнь 15, 2010, 19:57
возможно (http://msdn.microsoft.com/en-us/library/ms632668(VS.85).aspx).
хинт - платформозависимый код оборачивается в препроцессорные директивы, все дифайны кьют документированы:
Код:
#ifdefined(Q_OS_WIN)
...
#elif defined(Q_OS_LINUX)
...
#endif


Название: Re: Перенос фокуса на приложение.
Отправлено: crossly от Июнь 16, 2010, 10:08
Есть 3 приложения, 1 сервер и 2 клиента.
В начальном положении активно окно сервера (т.е. оно находится на первом плане). По получению некоторого сообщения от клиента, сервер должен вывести окно этого клиента на первый план (либо сам клиент по получению некоторого ответа от сервера стать поверх других окон). Как это можно реализовать? В документации видел информацию только про перевод фокуса между виджетами одного приложения.
Спасибо.
этим занимается оконный менеджер ...


Название: Re: Перенос фокуса на приложение.
Отправлено: Firefox от Июнь 16, 2010, 12:26
чтобы использовать WinAPI надо подключить библиотеку mmsystem.dll и хидер mmsystem.