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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDockWidget определение верхнего  (Прочитано 6906 раз)
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« : Май 19, 2020, 23:37 »

Доброго времени суток!
Существует QMainWindow, в котором есть несколько QDockWidget. Я их могу "собрать" в один, путём перетаскивания друг на друга. Получается что-то подобное QTabWidget. Понятно, что в разные моменты времени каждый из этих QDockWidget может стать "верхним" (допустим, кликом на него).
А может и несколько (если я мышкой их "растащу" по QMainWindow)
Вопрос: как программно можно определить какой из этих виджетов "верхний"? Или несколько из них.
Записан

navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Май 29, 2020, 18:50 »

Думаю надо смотреть в сторону QEvent::ShowEvent. Ловить это сообщение в твоем QWidget, который вставлен в док
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 29, 2020, 19:10 »

Думаю надо смотреть в сторону QEvent::ShowEvent. Ловить это сообщение в твоем QWidget, который вставлен в док
Не понял задумку, ну вот юзверь тыкнул мышей в один из виждетов и тот стал "верхним", но никаких ShowEvent не получим.

Неск лет назад была подобная задача и я не нашел ничего лучшего чем нырнуть в нативняк (там сканировать окна в Z-order)
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #3 : Май 30, 2020, 01:08 »

С Z-ордером тоже не всё так однозначно. Хотя решение должно быть...
Записан

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Май 30, 2020, 15:10 »

Скорее тут надо смотреть в сторону paintEvent, он не вызывается для перекрытых виджетов...
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 30, 2020, 15:19 »

Скорее тут надо смотреть в сторону paintEvent, он не вызывается для перекрытых виджетов...
По крайней мере в общем случае (DoubleBuffering) вызывается. Хотя это не так уж важно. Напр есть 3 окна, они как-то перекрываются, все получают paintEvent. И.. что с того?

Хотя решение должно быть...
Откуда такая уверенность?  Улыбающийся
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #6 : Май 30, 2020, 15:46 »

Откуда такая уверенность?  Улыбающийся
Сестра Надежда ещё не умерла. Улыбающийся Просто, если что-то можно сложить в стопку, то должно же как то отличаться верхнее, от не верхнего.
Я сомневаюсь, что я первый обратил на это внимание. Складывание доков в стопку вроде было еще в 4-ке...
P.S. А вот насчёт paintEvent надо проверить. Даже при перекрываемых окнах, у полностью открытого верхнего дока область отрисовки будет либо равной этому доку либо наибольшей у нескольких.
« Последнее редактирование: Май 30, 2020, 15:51 от tux » Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 30, 2020, 16:38 »

P.S. А вот насчёт paintEvent надо проверить. Даже при перекрываемых окнах, у полностью открытого верхнего дока область отрисовки будет либо равной этому доку либо наибольшей у нескольких.
Не стоит надеяться что, мол, рисование (области) не вызывается "для перекрытого другими", это давно уже не так. Qt кеширует рисование, напр если перекрытие изменилось - событие перерисовки не придет, будет использован кеш.

Если нужен только "самый верхний", то может просто qApp->activeWindow() ?
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #8 : Май 30, 2020, 17:22 »

Если нужен только "самый верхний", то может просто qApp->activeWindow() ?
Если бы это работало - я бы тему не поднимал. И это не работает и toplevelwidget. Есть предположение, что можно отследить перемещение виджетов и просто запоминать, какой из них в какой момент стал верхним (или несколько верхних).
Но однозначного решения я не нашёл.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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