Russian Qt Forum

Qt => Общие вопросы => Тема начата: tux от Май 19, 2020, 23:37



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


Название: Re: QDockWidget определение верхнего
Отправлено: navrocky от Май 29, 2020, 18:50
Думаю надо смотреть в сторону QEvent::ShowEvent. Ловить это сообщение в твоем QWidget, который вставлен в док


Название: Re: QDockWidget определение верхнего
Отправлено: Igors от Май 29, 2020, 19:10
Думаю надо смотреть в сторону QEvent::ShowEvent. Ловить это сообщение в твоем QWidget, который вставлен в док
Не понял задумку, ну вот юзверь тыкнул мышей в один из виждетов и тот стал "верхним", но никаких ShowEvent не получим.

Неск лет назад была подобная задача и я не нашел ничего лучшего чем нырнуть в нативняк (там сканировать окна в Z-order)


Название: Re: QDockWidget определение верхнего
Отправлено: tux от Май 30, 2020, 01:08
С Z-ордером тоже не всё так однозначно. Хотя решение должно быть...


Название: Re: QDockWidget определение верхнего
Отправлено: Пантер от Май 30, 2020, 15:10
Скорее тут надо смотреть в сторону paintEvent, он не вызывается для перекрытых виджетов...


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

Хотя решение должно быть...
Откуда такая уверенность?  :)


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


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

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


Название: Re: QDockWidget определение верхнего
Отправлено: tux от Май 30, 2020, 17:22
Если нужен только "самый верхний", то может просто qApp->activeWindow() ?
Если бы это работало - я бы тему не поднимал. И это не работает и toplevelwidget. Есть предположение, что можно отследить перемещение виджетов и просто запоминать, какой из них в какой момент стал верхним (или несколько верхних).
Но однозначного решения я не нашёл.