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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не получается убрать Qt::WindowStaysOnTopHint  (Прочитано 7984 раз)
UVV
Гость
« : Февраль 09, 2015, 14:13 »

Привет.
Был у одного диалога флаг Qt::WindowStaysOnTopHint. Я его убрал, но всё равно при переключении на другое приложение, диалог виден. Что ещё может быть не так? Что нужно сделать, чтобы при переключении на другое приложении, я не видел модальных окон моего приложения?
Спасибо.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Февраль 09, 2015, 14:21 »

Qt::WindowStaysOnBottomHint?
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 09, 2015, 14:51 »

У меня то же самое на Вындоуз (пока Qt 5.2, скоро буду обновляться). Сделал так: при переключении на др приложение пробегаюсь по всем окнам и в нативняке снимаю флаги, при активации возвращаю взад. Коряво конечно, но лучшего не нашел.

В общем присоединяюсь к вопросу
Записан
UVV
Гость
« Ответ #3 : Февраль 09, 2015, 15:10 »

Не, не. У меня немного по-другому, про тот баг я уже читал. Я в compile-time просто удалил Qt::WindowStaysOnTopHint, во флагах оставил Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 09, 2015, 15:28 »

Не, не. У меня немного по-другому, про тот баг я уже читал. Я в compile-time просто удалил Qt::WindowStaysOnTopHint, во флагах оставил Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint.
Это управление титлом и кнопками в нем, не вижу как оно поможет сделать окно "наверху"
Записан
UVV
Гость
« Ответ #5 : Февраль 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;
         }
...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Февраль 09, 2015, 16:09 »

так ты флаг из кода убрал, перекомпилировал, а диалог все равно поверх других приложений отображается?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
UVV
Гость
« Ответ #7 : Февраль 09, 2015, 16:14 »

Да.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 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'ов
Записан
UVV
Гость
« Ответ #9 : Февраль 09, 2015, 16:47 »

Ну это нормально, parent не может перекрывать child'ов

Ты не понял. Это означает, что если у parent'a выставлен WindowStaysOnTopHint, то и child'у он неявно поставится. Буду искать, где у меня у parent'a стоит WindowStaysOnTopHint..
Записан
UVV
Гость
« Ответ #10 : Февраль 09, 2015, 16:57 »

Копнём немного глубже. Stay On Top устанавливает свойство _NET_WM_STATE у иксов. В приложении выставляется значение свойств _NET_WM_STRUT у пары окон (в том числе и главного), но я что-то не вижу, как оно должно влиять на stay on top.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 09, 2015, 17:27 »

Это означает, что если у parent'a выставлен WindowStaysOnTopHint, то и child'у он неявно поставится.
Иначе parent перекроет child'а - а так нельзя

Ищите все установки WindowStaysOnTopHint в true и ставьте там точки останова
Записан
UVV
Гость
« Ответ #12 : Февраль 10, 2015, 12:47 »

Пришёл к решению в этом треде https://www.linux.org.ru/forum/development/11306527
Вывод: Gnome WM не обрабатывает флаги.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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