Название: tabbed docked area Отправлено: EhTemka от Декабрь 22, 2008, 11:49 Всем привет.
Qt 4.2.3 Такие вопросы. Есть некие доквиджеты, которые составлены в табулятор. Как-нибуть можно узнать, какой из доков в данный момент активен, а какие нет. Дело в том, что неактивные доквиджеты в табуляторе не являются почему-то скрытыми. Т.е. у них isVisible() = true. И как я не пробовал (в т.ч. с помошью eventFilter) отловить момент переключения доквиджетов в этом табуляторе, ни чего не получалось. И вообще, можно узнать в табуляторе ли доквиджет, или нет? Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 22, 2008, 14:36 QMainWindow использует QTabBar, который в принципе никак не привязан к виджетам кроме как через сигналы. Т.е. поступил сигнал currentChaned - вызывался метод QWidget::raise() для centralWidget() - (bring to top, поместить на вершину), по сути окна просто тупо лежат друг на друге (не используются ни QStackedWidget ни QStackedLayout). Т.ч. надо проверить возвращает ли centralWidget() текущее активное окно, а также попробывать всякие isActiveWindow, activateWindow...
Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 22, 2008, 15:26 Вообщем, я так понял, что ни как :(
Доки не становятся активными. Вообще при переключении доков в табуляторе происходит только два события QEvent::Move и QEvent::Paint Эх... Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 22, 2008, 17:23 А если сигнал обрабатывать этот ?
Цитировать void QDockWidget::visibilityChanged ( bool visible ) [signal] This signal is emitted when the dock widget becomes visible (or invisible). This happens when the widget is hidden or shown, as well as when it is docked in a tabbed dock area and its tab becomes selected or unselected. В самом QDockWidget на QEvent::Hide и QEvent::Show должны сигналы выпускаться. Еще вот такая штука интересная есть: Код
Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 22, 2008, 19:01 Цитировать В самом QDockWidget на QEvent::Hide и QEvent::Show должны сигналы выпускаться. В том то и дело, что не происходит ни Hide, ни Show.ПО поводу остального посмотрю. Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 22, 2008, 21:19 Цитировать В самом QDockWidget на QEvent::Hide и QEvent::Show должны сигналы выпускаться. В том то и дело, что не происходит ни Hide, ни Show.Ну дык ты же сказал, что в "табуляторе", я так понял ты говоришь о событиях QTabBar'a. А я предлагаю проверить события QDockWidget'a отдельно взятого. Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 23, 2008, 10:11 Я имел ввиду QDockWidget'ы составленные в табулятор. Пользователь распологает QDockWidget'ы как ему заблагорассудится. В том числе он может какие нибуть из них составить в табулятор. В доках у меня происходят запросы к базе данных каждые несколько секунд. Я хотел оптимизировать программу за счет того, чтобы не обновлять(производить запросы) в доке, который не виден в данный момент.
Проверял события QDockWidget'a отдельно взятого, так как к QTabBar'у доступа нет. По поводу QEvent::ZOrderChange. А где его отлавливать? Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 23, 2008, 13:50 Используй const QObjectList & QObject::children () const, список будет ровно в том порядке в котором находятся сестринские окна в стеке. Первый элемент - видимый и выше всех.
Название: Re: tabbed docked area Отправлено: vaprele07 от Декабрь 24, 2008, 06:43 QEvent::Hide и QEvent::Show приходят контролируемому виджету
QWidget * QDockWidget::widget () const, вот только в момент перетаскивания доквиджета они тоже приходят, почему хз. Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 24, 2008, 21:47 QEvent::Hide и QEvent::Show приходят контролируемому виджету QWidget * QDockWidget::widget () const, вот только в момент перетаскивания доквиджета они тоже приходят, почему хз. Какая версия Qt? У меня на QDockWidget::widget () приходит только QEvent::Paint при переключении. Qt 4.2.3 Используй const QObjectList & QObject::children () const, список будет ровно в том порядке в котором находятся сестринские окна в стеке. Первый элемент - видимый и выше всех. Этот вариант будет работать если я точно знаю, что все доки составлены в табулятор. Тогда, конечно, можно быть уверенным, что Первый элемент - видимый, остальные - нет. Может быть такая ситуация, что 3 виджета в табуляторе, а два сами по себе. И это ни как не определишь. В течении сессии я не знаю точно как расположены QDockWidget (т.е. в табуляторе ли они, или еще как). Если какие-то QDockWidgetы составленны в табулятор, то мне хотелось бы знать об этом, и знать, какой из доков сверху, а какие снизу. Всем спасибо за участие. Но видимо проблему можно решить (наверно?) с переходом на более новую версию Qt Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 25, 2008, 09:16 У виджетов есть координаты и размеры, если x,y,width, height совпадают, значит они в табуляторе. Ну или висят просто друг над другом как простые окна, т.е. уже за пределами mainwindow, на этот случай есть флаг isFloating().
Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 25, 2008, 11:00 SABROG, спасибо.
Хоть ты оказался и не прав на счет равенства координат, но ты (и штудирование кода кутешной библиотеки) направили меня на "путь истинный". Вообщем дело в следующем. Размеры у доков составленных в таб ессно одинаковы, и если брать QDockWidget::rect()-ы они будут одинаковы. Но вот если взять QDockWidget::geometry(), или проще x() или у(), то получится, что у доков, которые в табуляторе и неактивны(то есть снизу) - значения x,y отрицательны. Я не особо понимаю почему так (возможно так само куте понимает, что не надо рисовать этот виджет, или дает таким образом понять оконному менегеру), но факт. Если QDockWidget - ы составленны в табулятор, то у активного дока(который сверху) коодинаты положительные, у остальных - отрицательные. Хоть решение и карявенькое, зато простое -всего одна проверка. Код
Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 25, 2008, 23:49 Я пошаманил немного и нашел нестандартное решение. Сразу хочу предупредить, что этот вариант может не работать на других версиях Qt, т.к. в них может быть уже по другому реализован класс QMainWindow/QDockWidget.
Код
Логика кода следующая. Ищем все видимые QTabBar'ы и получаем указатель на QDockWidget, который в данный момент показывается пользователю (тоже самое что и QTabWidget::currentWidget()). Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 26, 2008, 16:31 reinterpret_cast как-то немного пугает :) Но идею понял.
Пока не буду это реализовывать (вариант с отрицательными координатами пока устраивает), но спасибо за разъяснение, как это всё работает. Имхо, лучшим вариантом было бы, если троли таки сделали нормальный интерфейс для работы с QDockWidget-ми Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 26, 2008, 17:30 Можно еще такой вариант провернуть. Коннектим сигнал visibilityChanged() каждого виджета к одному слоту в своем классе. Через sender() определяем отправителя, добавляем динамическое свойство QObject'a для QDockWidget'a, которое отображает текущее состояние: видимый/невидимый. Меняем в зависимости от пришедшего с сигналом флага. В общем замена методу isVisible(), раз уж он не работает почему-то.
Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 26, 2008, 18:52 visibilityChanged() вроде бы нет в 4 кутях. По крайней мере в 4.2.3. Да и не уверен что этот сигнал сработает в данном случаи. ТАк как не происходит изменения visibility.
Название: Re: tabbed docked area Отправлено: lit-uriy от Декабрь 26, 2008, 19:13 2 EhTemka, в 4.2.х нету.
из Асистента. void QDockWidget::visibilityChanged ( bool visible ) [signal] Эта функция была введена в Qt 4.3. но сработает в 4.3.х, см. тут (http://www.forum.crossplatform.ru/index.php?showtopic=1883&view=findpost&p=12046) Название: Re: tabbed docked area Отправлено: SABROG от Декабрь 26, 2008, 23:43 В 4.4 сигнал работает. В общем еще одно решение как узнать видимый ли докбар в данный момент.
Код
Соответственно проверять методом dockWidget->property("dockIsVisible"). Возвратит true или false. Название: Re: tabbed docked area Отправлено: EhTemka от Декабрь 27, 2008, 10:52 SABROG, а могли бы вы запостить тролям об данной проблеме, чтобы они придумали какое-нибуть стандартное (к примеру в виде функций(синалов/слотов) у QMainWindow или QDockWidget) решение? Просто я, во первых, ни когда этого не делал, во вторых, вы, мне кажется, более четко представляете что нам нужно :)
|