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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перенос фокуса на приложение.  (Прочитано 5266 раз)
Einior
Гость
« : Июнь 15, 2010, 09:35 »

Есть 3 приложения, 1 сервер и 2 клиента.
В начальном положении активно окно сервера (т.е. оно находится на первом плане). По получению некоторого сообщения от клиента, сервер должен вывести окно этого клиента на первый план (либо сам клиент по получению некоторого ответа от сервера стать поверх других окон). Как это можно реализовать? В документации видел информацию только про перевод фокуса между виджетами одного приложения.
Спасибо.
Записан
cya-st
Гость
« Ответ #1 : Июнь 15, 2010, 15:20 »

В винде смотри функции FindWindow, SetForegraundWindow, SetFocus
Записан
Einior
Гость
« Ответ #2 : Июнь 15, 2010, 17:36 »

Ммм? В винде? А силами кьют это не сделать?
Записан
sendevent
Гость
« Ответ #3 : Июнь 15, 2010, 17:45 »

мож, стоит глянуть на QWidget::raise/QWidget::activateWindow, но им, вроде как, надо чтобы приложение было активным изначально.
кроме того, "при получении некоторого сообщения" на клиенте можно поиграть с флагами его главного окна - наверно, самый действенный способ "залезть поверх всех".
Записан
Einior
Гость
« Ответ #4 : Июнь 15, 2010, 18:44 »

Первый способ не работает. Второй, в принципе тоже. Нашёл флаг Qt::WindowStaysOnTopHint, однако, когда ставлю приложению этот флаг, то его окно исчезает в никуда.
Записан
sendevent
Гость
« Ответ #5 : Июнь 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.
но возня с флагами - некрасивое решение, наверно, лучше вывести какую-нить нотификацию через трей/месседж бокс - смотря по специфике задач, решаемых клиентами.
« Последнее редактирование: Июнь 15, 2010, 19:15 от sendevent » Записан
Einior
Гость
« Ответ #6 : Июнь 15, 2010, 19:41 »

Да, с флагами получается что-то, но получается не очень красиво. Нашёл на форуме, что сделать можно с помощью вызова

AllowSetForegroundWindow(ASFW_ANY);

Как я понял, это функция WinAPI, однако я не совсем понимаю как такие функции использовать в Qt. Например, если просто вставить код с этой функцией, то комплиятор выдаёт ошибку о том, что такая функция и её параметр не объявлены. Возможно, нужно подключить какие-то библиотеки?
Записан
sendevent
Гость
« Ответ #7 : Июнь 15, 2010, 19:57 »

возможно.
хинт - платформозависимый код оборачивается в препроцессорные директивы, все дифайны кьют документированы:
Код:
#ifdefined(Q_OS_WIN)
...
#elif defined(Q_OS_LINUX)
...
#endif
« Последнее редактирование: Июнь 15, 2010, 20:07 от sendevent » Записан
crossly
Гость
« Ответ #8 : Июнь 16, 2010, 10:08 »

Есть 3 приложения, 1 сервер и 2 клиента.
В начальном положении активно окно сервера (т.е. оно находится на первом плане). По получению некоторого сообщения от клиента, сервер должен вывести окно этого клиента на первый план (либо сам клиент по получению некоторого ответа от сервера стать поверх других окон). Как это можно реализовать? В документации видел информацию только про перевод фокуса между виджетами одного приложения.
Спасибо.
этим занимается оконный менеджер ...
Записан
Firefox
Гость
« Ответ #9 : Июнь 16, 2010, 12:26 »

чтобы использовать WinAPI надо подключить библиотеку mmsystem.dll и хидер mmsystem.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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