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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Открыть поверх окон  (Прочитано 29017 раз)
wenny
Гость
« : Июль 04, 2016, 13:56 »

Доброго времени суток. Есть тулза, живущая в трее и высовывающая оттуда свой нос лишь затем, чтобы показать маленькую форму. При активации даблкликом мне бы хотелось эту форму, понятное дело, выводить поверх всего, однако затем позволить пользователю манипулировать ее приоритетом видимости.

Qt::WindowActive, увы, работает как-то странно. Например, он при определенных сценариях не может побороть окно creator'а.
Финт с назначением и последующим снятием Qt::WindowStaysOnTopHint не прокатывает - окно либо не раскрывается вовсе, либо сразу сворачивается. Один из моих потугов:
Код
C++ (Qt)
show();
QWidget::setWindowFlags( Qt::WindowStaysOnTopHint ); // и нет окна
 

Но как-то же все делают это? Тот же psi+ прекрасно поверх всего выскакивает (сука)! Спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 04, 2016, 14:43 »

Финт с назначением и последующим снятием Qt::WindowStaysOnTopHint не прокатывает - окно либо не раскрывается вовсе, либо сразу сворачивается. Один из моих потугов:
Код
C++ (Qt)
show();
QWidget::setWindowFlags( Qt::WindowStaysOnTopHint ); // и нет окна
 
Это нормально, нужно опять cделать show. И старые флаги может не все убивать
Записан
wenny
Гость
« Ответ #2 : Июль 04, 2016, 14:55 »

Код
C++ (Qt)
show();
QWidget::setWindowFlags( Qt::WindowStaysOnTopHint ); // и нет окна
QWidget::setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint );
show();
Creator перебить все равно не может Показает язык
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 04, 2016, 15:27 »

Попробуйте так
Код
C++ (Qt)
QWidget::setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
show();
 
Это работает у меня на Вындоуз
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Июль 04, 2016, 18:23 »

Код
C++ (Qt)
show();
QWidget::setWindowFlags( Qt::WindowStaysOnTopHint ); // и нет окна
QWidget::setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint );
show();
Creator перебить все равно не может Показает язык

Попробуйте ещё пару раз show().



В документации же написано - что при изменении флагов окно прячется, и нужно явным образом делать show(). Вторая проблема - все старые флаги вы очищаете, а так делать нельзя. Вот правильный код:

Код
C++ (Qt)
setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint );
show();
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июль 05, 2016, 06:18 »

Там дальше интереснее - открыть "поверх всех" можно, но такое окно торчит и когда переключился на др приложение. Это быстро достает, обычно хочется "поверх всех моих окон" или даже "поверх всех моих немодальных окон". Вроде бы  Qt::Tool то что нужно, но в пятерке он почему-то не работает "как доктор прописал"
Записан
wenny
Гость
« Ответ #6 : Июль 06, 2016, 20:45 »

Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 07, 2016, 05:40 »

Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете.
Но ведь Вы этого и хотели (открыть поверх окон). Выпиливание сводится к сбросу того же флага, также с последующим show. Если Вы имели ввиду какую-то др задачу - ее надо сформулировать
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Июль 07, 2016, 12:28 »

Увы, задача так и не решена. Было бы здорово включить и потом выпилить Qt::WindowStaysOnTopHint. А простое включение лишь перманентно выводит поверх всего на свете.

а ты хочешь убрать флаг on top, при этом чтобы окно осталось on top? Так не получится. Оконный менеджер так не позволит.
Записан
Bepec
Гость
« Ответ #9 : Июль 07, 2016, 13:35 »

Платформозависимые функции используйте. Типо setForegroundWindow().
Запихиваете его в showEvent, или на таймер сажайте. И вуаля, открывающееся окно будет на переднем плане, конечно без учёта случая закрытия его stayOnTop окном.
Записан
wenny
Гость
« Ответ #10 : Июль 07, 2016, 14:49 »

Но ведь Вы этого и хотели (открыть поверх окон). Если Вы имели ввиду какую-то др задачу - ее надо сформулировать
То, что я хотел, я сформулировал в первом абзаце топика. Если Вас не затруднит, пожалуйста, выделите полторы секунды своего времени на скролл до самого первого сообщения и ознакомьтесь с оным.

Я хотел ОТКРЫТЬ. Однако уточнил, что не хотел бы форму туда на веки вечные прибивать гвоздями. Выставление флага Qt::WindowStaysOnTopHint, при всем моем вопиющем нубстве, я бы, пожалуй, и без помощи qt-сообщества одолел, но все равно сердечное спасибо за участие.

Я хочу просто заставить форму выскочить поверх всего; заявить, так сказать, о ней юзеру. На данный момент я могу лишь установить ей наивысший оконный приоритет либо довольствоваться тем, что рендериться она будет там, где ей позволят.

Bepec, спасибо, попробую.
« Последнее редактирование: Июль 07, 2016, 14:53 от wenny » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Июль 07, 2016, 17:56 »

Я хочу просто заставить форму выскочить поверх всего; заявить, так сказать, о ней юзеру.

Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре.
Записан
wenny
Гость
« Ответ #12 : Июль 07, 2016, 22:06 »

Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре.
Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может. У меня ощущение, что этим сакральным знанием один лишь я не владею, а остальные тихо хихикают себе в кулак. Я вас раскусил, колитесь?!
« Последнее редактирование: Июль 07, 2016, 22:18 от wenny » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #13 : Июль 08, 2016, 00:27 »

Ни один оконный менеджер такого не позволит. В Windows, например, на приложение накладывается целый ряд условий, чтобы оно могло выводить окна на передний план. Если они не выполняются, то окно будет мигать а таскбаре.
Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может. У меня ощущение, что этим сакральным знанием один лишь я не владею, а остальные тихо хихикают себе в кулак. Я вас раскусил, колитесь?!

Когда-то давно делал и нужно было по клику менять флаг "поверх всех окон"

Нужная константа тут: https://github.com/gil9red/NotesManager/blob/master/Note/NoteShared.h
Но она на флаг "поверх всех окон" не влияет -- мне нужно было свое окно, поэтому и использовал ее.

Поэтому только используйте Qt::WindowStaysOnTopHint и вызывайте show(), чтобы окно появилось, потому при смене флагов оно теряет видимость.
« Последнее редактирование: Июль 08, 2016, 00:35 от gil9red » Записан

Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Июль 08, 2016, 00:44 »

Скажем, целый ряд прожек (psi+, например) прекрасно выскакивают поверх creator'a, однако моя - ровно в тех же условиях - этого сделать не может.

Без минимального проекта в архиве тут что-то ещё сложно сказать, проблема описана очень общо. Что значит поверх креатора? Запускаемое приложение и так получает фокус. Значит ситуация сложнее, а мы тут не телепаты.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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