Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: UVV от Февраль 09, 2015, 14:13



Название: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 14:13
Привет.
Был у одного диалога флаг Qt::WindowStaysOnTopHint. Я его убрал, но всё равно при переключении на другое приложение, диалог виден. Что ещё может быть не так? Что нужно сделать, чтобы при переключении на другое приложении, я не видел модальных окон моего приложения?
Спасибо.


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: gil9red от Февраль 09, 2015, 14:21
Qt::WindowStaysOnBottomHint?


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: Igors от Февраль 09, 2015, 14:51
У меня то же самое на Вындоуз (пока Qt 5.2, скоро буду обновляться). Сделал так: при переключении на др приложение пробегаюсь по всем окнам и в нативняке снимаю флаги, при активации возвращаю взад. Коряво конечно, но лучшего не нашел.

В общем присоединяюсь к вопросу


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 15:10
Не, не. У меня немного по-другому, про тот баг я уже читал. Я в compile-time просто удалил Qt::WindowStaysOnTopHint, во флагах оставил Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint.


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: Igors от Февраль 09, 2015, 15:28
Не, не. У меня немного по-другому, про тот баг я уже читал. Я в compile-time просто удалил Qt::WindowStaysOnTopHint, во флагах оставил Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint.
Это управление титлом и кнопками в нем, не вижу как оно поможет сделать окно "наверху"


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 15:36
Во чо нашёл:
Код:
QWidgetPrivate::create_sys ()
{
...
     if (topLevel) {
         if (parentWidget) { // if our parent stays on top, so must we
             QWidget *ptl = parentWidget->window();
             if(ptl && (ptl->windowFlags() & Qt::WindowStaysOnTopHint))
                 flags |= Qt::WindowStaysOnTopHint;
         }
...


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: kambala от Февраль 09, 2015, 16:09
так ты флаг из кода убрал, перекомпилировал, а диалог все равно поверх других приложений отображается?


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 16:14
Да.


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: Igors от Февраль 09, 2015, 16:25
Во чо нашёл:
Код:
QWidgetPrivate::create_sys ()
{
...
     if (topLevel) {
         if (parentWidget) { // if our parent stays on top, so must we
             QWidget *ptl = parentWidget->window();
             if(ptl && (ptl->windowFlags() & Qt::WindowStaysOnTopHint))
                 flags |= Qt::WindowStaysOnTopHint;
         }
...
Ну это нормально, parent не может перекрывать child'ов


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 16:47
Ну это нормально, parent не может перекрывать child'ов

Ты не понял. Это означает, что если у parent'a выставлен WindowStaysOnTopHint, то и child'у он неявно поставится. Буду искать, где у меня у parent'a стоит WindowStaysOnTopHint..


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 09, 2015, 16:57
Копнём немного глубже. Stay On Top устанавливает свойство _NET_WM_STATE у иксов. В приложении выставляется значение свойств _NET_WM_STRUT у пары окон (в том числе и главного), но я что-то не вижу, как оно должно влиять на stay on top.


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: Igors от Февраль 09, 2015, 17:27
Это означает, что если у parent'a выставлен WindowStaysOnTopHint, то и child'у он неявно поставится.
Иначе parent перекроет child'а - а так нельзя

Ищите все установки WindowStaysOnTopHint в true и ставьте там точки останова


Название: Re: Не получается убрать Qt::WindowStaysOnTopHint
Отправлено: UVV от Февраль 10, 2015, 12:47
Пришёл к решению в этом треде https://www.linux.org.ru/forum/development/11306527
Вывод: Gnome WM не обрабатывает флаги.