Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bosfor от Июнь 09, 2010, 15:34



Название: Поймать изменение размера QDockWidget
Отправлено: bosfor от Июнь 09, 2010, 15:34
Подскажите плиз.

Имею несколько QDockWidget`тов на QMainWindow
как мне отловить изменение размеров приклееных dock виджетов ?


Название: Re: Поймать изменение размера QDockWidget
Отправлено: DS_tm от Июнь 10, 2010, 11:30
Создаете класс наследник от QDockWidget и переопределяете
void QWidget::resizeEvent (QResizeEvent *event)   [virtual protected] таким образом, чтобы она высылала сигнал.


Название: Re: Поймать изменение размера QDockWidget
Отправлено: Barmaglodd от Июнь 10, 2010, 11:37
Можно eventFilter установить и от QDockWidget не надо наследоваться.


Название: Re: Поймать изменение размера QDockWidget
Отправлено: DS_tm от Июнь 10, 2010, 11:44
Можно eventFilter установить и от QDockWidget не надо наследоваться.
Ну или так да, хотя меня фильтрация сообщений не прельщает своей плохой наглядностью, да и судя по вопросу человеку будет проще наследовать нежели изучать механизм фильтрации.


Название: Re: Поймать изменение размера QDockWidget
Отправлено: bosfor от Июнь 10, 2010, 17:08
Спасибо ! Первый вариант переопределения функции выручил. Правда пришлось свой сигнал делать
Код:
void MyResizeEvent(QResizeEvent *event);
так как данные мне удобно обрабатывать в классе главного окна .


Название: Re: Поймать изменение размера QDockWidget
Отправлено: Авварон от Июнь 10, 2010, 17:44
я бы так не делал... важно понимать почему есть система эвентов, а не посылка сигнала аппликейшном, сконнекченным с классом. Такие события как перемещение мыши и изменение размера происходят часто, а сигналы/слоты медленные (не очень, но все ж). Так что стоит подумать, адекватно ли такое частое кидание сигнала на каждый приход резайз эвента.


Название: Re: Поймать изменение размера QDockWidget
Отправлено: DS_tm от Июнь 10, 2010, 20:40
Согласен, делегирование обязанности главному окну с помощью сигнала решение не лучшее, вся прелесть сигналов в том, что инициатор сигнала ничего не знает о получателе(ях), но за это приходиться платить производительностью. В Вашем случае лучше передать указатель на объект главного окна в конструкторе класса наследника QDockWidget (а Вы это наверняка итак делаете) а далее в обработчике resize вызывать соответствующую функцию главного окна напрямую, передавая в качестве параметра this.

Код
C++ (Qt)
void MyDockWidget::resize(QResizeEvent *event) {
 mainWindow->someFunction(event, this);
}
 


Название: Re: Поймать изменение размера QDockWidget
Отправлено: Авварон от Июнь 10, 2010, 20:47
в нашем случае на доквиджет вешается эвент фильтр - само главное окно. Криво архитектурно (но лишь потенциально), зато просто и производительно


Название: Re: Поймать изменение размера QDockWidget
Отправлено: bosfor от Июнь 11, 2010, 08:47
Код
C++ (Qt)
void MyDockWidget::resize(QResizeEvent *event) {
 mainWindow->someFunction(event, this);
}
 
спасибо, учту рекомендации.

в нашем случае на доквиджет вешается эвент фильтр - само главное окно. Криво архитектурно (но лишь потенциально), зато просто и производительно
механизмом фильтра непользовался, буду благодарен за ссылочуку или короткий пример кода.