Название: Открыть поверх окон Отправлено: wenny от Июль 04, 2016, 13:56 Доброго времени суток. Есть тулза, живущая в трее и высовывающая оттуда свой нос лишь затем, чтобы показать маленькую форму. При активации даблкликом мне бы хотелось эту форму, понятное дело, выводить поверх всего, однако затем позволить пользователю манипулировать ее приоритетом видимости.
Qt::WindowActive, увы, работает как-то странно. Например, он при определенных сценариях не может побороть окно creator'а. Финт с назначением и последующим снятием Qt::WindowStaysOnTopHint не прокатывает - окно либо не раскрывается вовсе, либо сразу сворачивается. Один из моих потугов: Код
Но как-то же все делают это? Тот же psi+ прекрасно поверх всего выскакивает (сука)! Спасибо. Название: Re: Открыть поверх окон Отправлено: Igors от Июль 04, 2016, 14:43 Финт с назначением и последующим снятием Qt::WindowStaysOnTopHint не прокатывает - окно либо не раскрывается вовсе, либо сразу сворачивается. Один из моих потугов: Это нормально, нужно опять cделать show. И старые флаги может не все убивать Код
Название: Re: Открыть поверх окон Отправлено: wenny от Июль 04, 2016, 14:55 Код Creator перебить все равно не может :P Название: Re: Открыть поверх окон Отправлено: Igors от Июль 04, 2016, 15:27 Попробуйте так
Код Это работает у меня на Вындоуз Название: Re: Открыть поверх окон Отправлено: Alex Custov от Июль 04, 2016, 18:23 Код Creator перебить все равно не может :P Попробуйте ещё пару раз show(). (http://iscience.ru/wp-content/uploads/2015/12/sarcasm21.jpg) В документации же написано - что при изменении флагов окно прячется, и нужно явным образом делать show(). Вторая проблема - все старые флаги вы очищаете, а так делать нельзя. Вот правильный код: Код
Название: Re: Открыть поверх окон Отправлено: Igors от Июль 05, 2016, 06:18 Там дальше интереснее - открыть "поверх всех" можно, но такое окно торчит и когда переключился на др приложение. Это быстро достает, обычно хочется "поверх всех моих окон" или даже "поверх всех моих немодальных окон". Вроде бы Qt::Tool то что нужно, но в пятерке он почему-то не работает "как доктор прописал"
Название: Re: Открыть поверх окон Отправлено: wenny от Июль 06, 2016, 20:45 Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете.
Название: Re: Открыть поверх окон Отправлено: Igors от Июль 07, 2016, 05:40 Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете. Но ведь Вы этого и хотели (открыть поверх окон). Выпиливание сводится к сбросу того же флага, также с последующим show. Если Вы имели ввиду какую-то др задачу - ее надо сформулироватьНазвание: Re: Открыть поверх окон Отправлено: Alex Custov от Июль 07, 2016, 12:28 Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете. а ты хочешь убрать флаг on top, при этом чтобы окно осталось on top? Так не получится. Оконный менеджер так не позволит. Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 07, 2016, 13:35 Платформозависимые функции используйте. Типо setForegroundWindow().
Запихиваете его в showEvent, или на таймер сажайте. И вуаля, открывающееся окно будет на переднем плане, конечно без учёта случая закрытия его stayOnTop окном. Название: Re: Открыть поверх окон Отправлено: wenny от Июль 07, 2016, 14:49 Но ведь Вы этого и хотели (открыть поверх окон). Если Вы имели ввиду какую-то др задачу - ее надо сформулировать То, что я хотел, я сформулировал в первом абзаце топика. Если Вас не затруднит, пожалуйста, выделите полторы секунды своего времени на скролл до самого первого сообщения и ознакомьтесь с оным.Я хотел ОТКРЫТЬ. Однако уточнил, что не хотел бы форму туда на веки вечные прибивать гвоздями. Выставление флага Qt::WindowStaysOnTopHint, при всем моем вопиющем нубстве, я бы, пожалуй, и без помощи qt-сообщества одолел, но все равно сердечное спасибо за участие. Я хочу просто заставить форму выскочить поверх всего; заявить, так сказать, о ней юзеру. На данный момент я могу лишь установить ей наивысший оконный приоритет либо довольствоваться тем, что рендериться она будет там, где ей позволят. Bepec, спасибо, попробую. Название: Re: Открыть поверх окон Отправлено: Alex Custov от Июль 07, 2016, 17:56 Я хочу просто заставить форму выскочить поверх всего; заявить, так сказать, о ней юзеру. Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре. Название: Re: Открыть поверх окон Отправлено: wenny от Июль 07, 2016, 22:06 Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре. Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может. У меня ощущение, что этим сакральным знанием один лишь я не владею, а остальные тихо хихикают себе в кулак. Я вас раскусил, колитесь?!Название: Re: Открыть поверх окон Отправлено: gil9red от Июль 08, 2016, 00:27 Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре. Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может. У меня ощущение, что этим сакральным знанием один лишь я не владею, а остальные тихо хихикают себе в кулак. Я вас раскусил, колитесь?!Когда-то давно делал (https://github.com/gil9red/NotesManager/blob/master/Note/abstractnote.cpp#L159) и нужно было по клику менять флаг "поверх всех окон" Нужная константа тут: https://github.com/gil9red/NotesManager/blob/master/Note/NoteShared.h Но она на флаг "поверх всех окон" не влияет -- мне нужно было свое окно, поэтому и использовал ее. Поэтому только используйте Qt::WindowStaysOnTopHint и вызывайте show(), чтобы окно появилось, потому при смене флагов оно теряет видимость. Название: Re: Открыть поверх окон Отправлено: Alex Custov от Июль 08, 2016, 00:44 Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может. Без минимального проекта в архиве тут что-то ещё сложно сказать, проблема описана очень общо. Что значит поверх креатора? Запускаемое приложение и так получает фокус. Значит ситуация сложнее, а мы тут не телепаты. Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 08, 2016, 03:30 Иногда креатор глючит и становится "главным" окном для дебажнйо прожки. Но только в режиме дебага.
Название: Re: Открыть поверх окон Отправлено: Igors от Июль 08, 2016, 08:14 То, что я хотел, я сформулировал в первом абзаце топика. Если Вас не затруднит, пожалуйста, выделите полторы секунды своего времени на скролл до самого первого сообщения и ознакомьтесь с оным. Нисколько не затруднит :)При активации даблкликом мне бы хотелось эту форму, понятное дело, выводить поверх всего, однако затем позволить пользователю манипулировать ее приоритетом видимости. Какие манипуляции имелись ввиду ??? Предложите разумный сценарий, напр- если приложение в фокусе (foreground) - некоторые его окна торчат поверх всех, иначе они скрыты Это довольно стандартное поведение "floating palette", реализовано во многих приложениях (см напр Photoshop). Если хотите чего-то другого - то чего? Название: Re: Открыть поверх окон Отправлено: Racheengel от Июль 08, 2016, 10:18 Я так понимаю, что человеку надо открыть дополнительное окно приложения, чтобы оно висело только поверх других окон ЭТОГО приложения, а не ВСЕХ других приложений (что делает Qt::WindowStaysOnTopHint). Т.е. что-то типа Z-координаты, которая всегда держит окно вверху.
(Кстати, ничего подобного я тоже в доке Qt не нашел, хотя иногда такое может быть нужно. В WinApi для этого есть флаг HWND_TOP). Название: Re: Открыть поверх окон Отправлено: Igors от Июль 08, 2016, 10:52 Я так понимаю, что человеку надо открыть дополнительное окно приложения, чтобы оно висело только поверх других окон ЭТОГО приложения, а не ВСЕХ других приложений (что делает Qt::WindowStaysOnTopHint). Т.е. что-то типа Z-координаты, которая всегда держит окно вверху. Такое нужно частенько, и об этом разговор был(Кстати, ничего подобного я тоже в доке Qt не нашел, хотя иногда такое может быть нужно. Там дальше интереснее - открыть "поверх всех" можно, но такое окно торчит и когда переключился на др приложение. Это быстро достает, обычно хочется "поверх всех моих окон" или даже "поверх всех моих немодальных окон". В WinApi для этого есть флаг HWND_TOP). Это просто "одноразовая" установка, от перекрытия не спасаетДа, кстати о птичках: а где же те кто так яро защищал Вындоуз и доказывал ее "не-убогость"? У Вас отличная возможность утереть всем нос показав как это сделать! Или то хорошо было "просто так" калякать ? :) Название: Re: Открыть поверх окон Отправлено: wenny от Июль 08, 2016, 11:08 Видать, никто не сталкивался. Тогда иллюстрация. Запускаем Хром, даблкликаем по моей прожке в трее и...
(http://s8.hostingkartinok.com/uploads/images/2016/07/932b4640a2d4f7bad73e51a83daa37a5.jpg) Суть в том, что если последний фокус перед даблкликом был на другом приложении, то прожка запускается ПОД ним. Psi+, например, это не мешает выскакивать поверх Хрома. Надеюсь, теперь понятно всем. Название: Re: Открыть поверх окон Отправлено: kambala от Июль 08, 2016, 11:11 так а что мешает заглянуть в код пси? :) это ж открытый проект, насколько я помню.
Название: Re: Открыть поверх окон Отправлено: wenny от Июль 08, 2016, 11:15 так а что мешает заглянуть в код пси? :) это ж открытый проект, насколько я помню. Название: Re: Открыть поверх окон Отправлено: kambala от Июль 08, 2016, 11:27 там вполне может использоваться платформозависимый функционал
Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 08, 2016, 11:49 Видать, никто не сталкивался. Тогда иллюстрация. Запускаем Хром, даблкликаем по трею и... Все-таки не понятно. Запускаю хром, даблкликаю по трею на хроме и ... открывается хром, даблкликаю на моей проге и открывается моя прога, над хромом. Да, кстати о птичках: а где же те кто так яро защищал Вындоуз и доказывал ее "не-убогость"? У Вас отличная возможность утереть всем нос показав как это сделать! Или то хорошо было "просто так" калякать ? :) Чаще "просто так" калякать, у вас получается. ;) Все в винде нормально работает. Название: Re: Открыть поверх окон Отправлено: wenny от Июль 08, 2016, 11:56 даблкликаю по трею на хроме Я на всякий случай поправил свое сообщение, но.. зачем Вы даблкликаете по трею хрома? Речь вообще не о нем.даблкликаю на моей проге и открывается моя прога, над хромом. Вот и я хочу над Хромом.Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 08, 2016, 11:58 чтобы
Цитировать Суть в том, что если последний фокус перед даблкликом был на другом приложении Цитировать Вот и я хочу над Хромом. виндоус какой у вас? Название: Re: Открыть поверх окон Отправлено: wenny от Июль 08, 2016, 12:02 Семерка. Не делаю ничего необычного: просто hide() | show().
Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 08, 2016, 12:10 У меня одним кликом открывается без проблем и двумя:
Код: connect(c_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))); Код: void sMainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason) Может это поможет Название: Re: Открыть поверх окон Отправлено: wenny от Июль 08, 2016, 12:27 Да, activateWindow() спас, спасибо :)
Название: Re: Открыть поверх окон Отправлено: Igors от Июль 08, 2016, 14:46 Все в винде нормально работает. А что "все"? Окно(а) приложения в фокусе поверх других? Ну для такого ОС - уже успех :)Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 08, 2016, 16:26 Все в винде нормально работает. А что "все"? Окно(а) приложения в фокусе поверх других? Ну для такого ОС - уже успех :)Вы о чем вообще? ??? Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 08, 2016, 16:39 Обострение у него, не обращайте внимания )
Название: Re: Открыть поверх окон Отправлено: Igors от Июль 08, 2016, 17:15 Вы о чем вообще? ??? Ну вообще-то о том что "поверх окон" означает "другие окна не могут его перекрыть". Такой возможности в Вындоуз я не нашел (хоть с API хоть как). Есть только идиотское TOPMOST которое никого не устраивает.Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 08, 2016, 17:19 Хм. А как вы представляете если будут 2 окна поверх всех? :D
Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 08, 2016, 17:50 Вы о чем вообще? ??? Ну вообще-то о том что "поверх окон" означает "другие окна не могут его перекрыть". Такой возможности в Вындоуз я не нашел (хоть с API хоть как). Есть только идиотское TOPMOST которое никого не устраивает.А Qt::WindowStaysOnTopHint разве не "поверх окон"? Название: Re: Открыть поверх окон Отправлено: Igors от Июль 08, 2016, 18:24 А Qt::WindowStaysOnTopHint разве не "поверх окон"? Это тот же самый topmost - бей и своих и чужих. Название: Re: Открыть поверх окон Отправлено: Racheengel от Июль 08, 2016, 18:45 Qt::WindowStaysOnTopHint поверх ВООБЩЕ ВСЕХ окон, а надо, чтобы был только поверх окон приложения (но не модальным).
Я вот не знаю, как это сделать, честно говоря... Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 08, 2016, 19:48 В принципе написать можно, всё для этого есть.
Аля берём qApp->windows, цепляемся за сигналы потери/появления фокуса и при каждом проверяем весь список на наличие фокуса и перекрытия. При полной потере фокуса вобще ничего не делаем, при фокусе внутри супер топ окно выводим на передний план. Хотя пока не очень ясны все сценарии вроде модальных окон, Ну и конечно вариант наползание активного окна на весь экран. Т.е. реализовать можно, но нужны будут костыли, т.к. основные проблемы - это реализация оконного менеджера. Название: Re: Открыть поверх окон Отправлено: Igors от Июль 09, 2016, 12:14 Qt::WindowStaysOnTopHint поверх ВООБЩЕ ВСЕХ окон, а надо, чтобы был только поверх окон приложения (но не модальным). Я делал так: когда создаем палетки - ставим им topmost, модальным диалогам тоже (иначе палетки их перекроют). Когда приложение теряет фокус - втихаря убираем topmost, причем нативным API (чтобы не мигало). И наоборот - приложение получает фокус - доливаем topmost. Вот такую "систему рычагов" пришлось городить на "самом дружественном" ОС. Я вот не знаю, как это сделать, честно говоря... Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 09, 2016, 12:31 Не забываем - самая дружественная для пользователя. А вы, увы, программист :D
Название: Re: Открыть поверх окон Отправлено: Racheengel от Июль 09, 2016, 18:16 Я делал так: когда создаем палетки - ставим им topmost, модальным диалогам тоже (иначе палетки их перекроют). Когда приложение теряет фокус - втихаря убираем topmost, причем нативным API (чтобы не мигало). И наоборот - приложение получает фокус - доливаем topmost. Да, спасибо, видать, придется как-то так извращаться... Хотя по идее флаг типа Qt::ToolWindow могли бы запилить) а палетки- это что,кстати? Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 09, 2016, 19:44 Qt::WindowStaysOnTopHint поверх ВООБЩЕ ВСЕХ окон, а надо, чтобы был только поверх окон приложения (но не модальным). Я вот не знаю, как это сделать, честно говоря... Все зависит от приложения. У меня в приложении каждый виджет открывается как самостоятельное окно. Но мне например не нужно, чтобы было окно над всеми моими открытыми окнами. А над отдельным окном, так это делать совсем не сложно. Название: Re: Открыть поверх окон Отправлено: Igors от Июль 10, 2016, 10:32 Хотя по идее флаг типа Qt::ToolWindow могли бы запилить) Так он и есть (Qt::Tool) - но по-моему на Вындоуз он никогда не работал (последний раз проверял в 5.2)а палетки- это что,кстати? Ну типа "тулзы" или "инфа" - см тот же Photoshop. Простой пример - где вывести координаты мыши? Если просто "в каком-то окне" - замучаетесь его наверх доставать/пристраивать. А бывает что и самое обычное окно нужно сделать floating. Напр "данные загружены" и можно по клавише запускать расчет(ы)Название: Re: Открыть поверх окон Отправлено: Racheengel от Июль 10, 2016, 11:05 С 5.6.1 Qt::Tool до сих пор не работает, значит :(
Причем я помню, что раньше с Qt::Tool у окна тонкий хедер получался. А сейчас и этого нет :( (Windows 7) UPDATE: сейчас проверил на 10-й винде... Однако, там все ок, похоже ??? Название: Re: Открыть поверх окон Отправлено: Igors от Июль 10, 2016, 12:09 UPDATE: сейчас проверил на 10-й винде... Однако, там все ок, похоже ??? Возьмите пример windowFlags. Добавьте еще окно в mainКод Запустите пример и создайте окно Qt::Tool выбрав бубочку. Теперь активируйте окно "Test" и убедитесь что оно успешно перекрывает окно Tool :'( Название: Re: Открыть поверх окон Отправлено: PimenS от Июль 10, 2016, 12:21 А в Линуксе или в Mac OS, как себя ведет Qt::Tool?
Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 10, 2016, 12:27 Окно tool выше своего родителя, так что всё по логике. А вы создаёте отдельное окно, что и перекрывает его.
А то, что вы хотите - не имеет названия. В качестве пруфа - выдержка из Assistant'a: Цитировать Indicates that the widget is a tool window. A tool window is often a small window with a smaller than usual title bar and decoration, typically used for collections of tool buttons. If there is a parent, the tool window will always be kept on top of it. If there isn't a parent, you may consider using Qt::WindowStaysOnTopHint as well. If the window system supports it, a tool window can be decorated with a somewhat lighter frame. It can also be combined with Qt::FramelessWindowHint. On OS X, tool windows correspond to the Floating class of windows. This means that the window lives on a level above normal windows; it impossible to put a normal window on top of it. By default, tool windows will disappear when the application is inactive. This can be controlled by the Qt::WA_MacAlwaysShowToolWindow attribute Вкратце - всегда поверх родителя. К остальным окнам оно отношения не имеет.PS работает W7 x64, Qt 4.7.2/5.6. Название: Re: Открыть поверх окон Отправлено: Igors от Июль 10, 2016, 13:01 А в Линуксе или в Mac OS, как себя ведет Qt::Tool? Про линукс ничего не знаю, а на Mac это штатное поведениеЦитировать On OS X, tool windows correspond to the Floating class of windows. This means that the window lives on a level above normal windows; it impossible to put a normal window on top of it. Зато диалоги и попапки его перекрывают.Справедливости ради - и на OSX Qt::Tool у меня почему-то не сработал :) Пришлось написать неск строк в какаве (тамошнее API). Ну там легко т.к. я точно знал что в ОС это есть. Может уже и в Qt пофиксили Окно tool выше своего родителя, так что всё по логике. Так это справедливо для любого окна :) А вы создаёте отдельное окно, что и перекрывает его. Я там вверху для Вас жирным выделил :)А то, что вы хотите - не имеет названия. В качестве пруфа - выдержка из Assistant'a: Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 10, 2016, 15:20 Я вам ясно сказал что стандартный функционал этого не предусматривает.
А вы мне тычете платформозависимым функционалом и говорите "Как же так, почему оно не работает в других ОС"? Мб потому что это платформозависимый функционал? :D Название: Re: Открыть поверх окон Отправлено: Igors от Июль 10, 2016, 16:29 Я вам ясно сказал Вам лучше не говорить, а слушать :)Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 10, 2016, 18:25 А лучше логически мыслить.
Фишка одной ОС, не поддерживаемая во всех других - это исключение. И поэтому говорить о Windows "о боже оно не поддерживает фишку MAC OS" - это лицемерие :) Название: Re: Открыть поверх окон Отправлено: Racheengel от Июль 10, 2016, 22:04 Запустите пример и создайте окно Qt::Tool выбрав бубочку. Теперь активируйте окно "Test" и убедитесь что оно успешно перекрывает окно Tool :'( В этом примере, в принципе, так и должно быть - поскольку окно "Test" не имеет родителя, то оно как бы "глобально". Я пробовал и другие модификации, и вроде как в 10-ке все как надо... Проверю завтра в 7-ке на работе еще. Название: Re: Открыть поверх окон Отправлено: Igors от Июль 11, 2016, 10:23 В этом примере, в принципе, так и должно быть - поскольку окно "Test" не имеет родителя, то оно как бы "глобально". Не должно. Нормальный оконный менеджер умеет/понимает "слои" окон - любое окно из верхнего слоя "выше" (неперекрываемо) любым окном нижнего. А окна одного слоя перекрываются в обычном порядке. А кто там родитель - это др разговор. В том же примере создайте просто Qt::Window - и тоже окно упр-я его не перекроет т.к. оно его родитель. Но желаемого поведения палеток на этом не получить.Название: Re: Открыть поверх окон Отправлено: Bepec от Июль 11, 2016, 13:07 Это в идеологии mac os так сделано, насколько я понял, не более.
В идеологии нормального менеджера, каждое окно может быть как выше так и ниже. 3 стандартных слоя - выше всех, стандартное окно, ниже всех. И на слое стандартных окон возможны уже tool окна, которые являются его детьми. При этом каждое окно - равнозначная сущность, которая может быть или 1 или 2 или 3. Не видел ни 1 программы с вашим "поведением" окон на linux. Пожалуйста развейте мои сомнения. Cлоевая система окон неудобна для пользователя. Ведь при выборе окна нижнего уровня, вы его никогда не увидите, пока не закроете все уровни выше. А какой простор это даёт для зловредов. Более того, неудобно будет и при разработке приложения - ведь возможно более десяти окон на разных слоях, что лишь запутывает пользователя, не давая ему преимуществ. И таки да - пользователь всегда работает с одним окном. Чтобы работать в двух одновременно, нужны уже 2 мышки, 2 клавитуры, 4 руки :D 2 и более окон удобны лишь для наблюдения/получения информации. |