Помогите пожалуйста разобраться с resizeEvent |
Здравствуйте, гость ( Вход | Регистрация )
Помогите пожалуйста разобраться с resizeEvent |
Rocky |
18.2.2010, 21:31
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
У меня такая ситуация. Есть главная форма. На нее в зависимости от ситуации "кладется" либо одна, либо другая формы (просто производные от QWidget). Одна форма (для определенности) CMainForm, другая - CPlayingFormType1. На главной форме вообще ничего нет (ни одного виджета). Когда я нажимаю кнопку на форме CMainForm, по задумке она исчезает, и появляется CPlayingFormType1. Проблема в ресайзе. Уже 2 дня никак не могу понять в чем дело.
Во всех 3-х классах переопределен resizeEvent. Когда CMainForm видна (а соответственно CPlayingFormType1 не видна), при ресайзе я проваливаюсь в CMainForm::resizeEvent. Тут все ок, т.е. виджеты из CMainForm меняют свою геометрию при изменении размеров главного окна. А вот когда CPlayingFormType1 видна (а соответственно CMainForm не видна) тут кирдык. CPlayingFormType1::resizeEvent не срабатывает... Но почему-то срабатывает resizeEvent главного окна. И у CMainForm и у CPlayingFormType1 родитель - главное окно... Подскажите пожалуйста как разобраться с этим? Как выяснить, почему не вызывается resizeEvent? Штука в том, что даже updateGeometry ничего не делает... Я пробовал даже в момент, когда должно появиться окно CPlayingFormType1 делать так:
Не помогает. verticalLayout_6 - это "главный лэйаут" CPlayingFormType1... ( |
|
|
Litkevich Yuriy |
18.2.2010, 21:49
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Rocky |
18.2.2010, 22:59
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
а для чего тебе этот обработчик. На самом деле там ноги растут дальше. В центре CPlayingFormType1 расположены несколько виджетов. Вот эта форма. Вот этим виджетам по середине я задаю фиксированный размер какой-то (задается извне). Видно, что по бокам тоже находятся виджеты. И они связаны лэйаутом. Т.е. их размеры тоже должны меняться при изменении этих виджетов в середине. И в момент, когда я изменяю размер срединных виджетов, мне надо знать положение этих боковых виджетов. А вызов geometry() этих боковых виджетов возвращает старые размеры. Т.е. даже если я вызову updateGeometry для вообще всей этой формы (CPlayingFormType1), геометрия этих боковых виджетов все равно остается старой (на этот момент. Она изменится только один раз, при повторном отображении CPlayingFormType1, см. ниже). Вобщем, копался-копался, и выяснил что resizeEvent ни у CPlayingFormType1 ни у одного из ее дочерних виджетов не вызывается вообще. Она вызывается только один раз при самом первом появлении CPlayingFormType1 на экране... Потом хоть что делай, она не вызывается. Соответственно я могу хоть как именить геометрию окна, а виджеты в CPlayingFormType1 остаются на своих местах. Я до конца не понял, ты используешь термин "Форма", ты подразумеваешь под этим самостоятельное окно? ну как бы есть форма смысле в дизайнере сделал. Создал класс производный от нее и от QWidget (это есть CPlayingFormType1). У этого класса родитель QMainWidget (которой в предыдущем посте я обозвал "главная форма"). И соответсвенно есть еще CMainForm (по сути ничем не отличающийся от CPlayingFormType1). Просто ресайз делается для CMainForm, а для CPlayingFormType1 нет. Вот в этом и беда(( Цитата(Я) Она изменится только один раз, при повторном отображении CPlayingFormType1, см. ниже). ............. Она вызывается только один раз при самом первом появлении CPlayingFormType1 Вот тут не противоречие, а так и есть. Т.е. при первом появлении CPlayingFormType1::resizeEvent срабатывает, потом я изменяю размер серединным виджетам, якобы все обновляю (через updateGeometry), затем запрашиваю размеры боковым виджетам, но получаю старые размеры (хотя при выходе из отладчика смотрю на прогу и вижу эти боковые виджеты как они и должны быть - размеры-то у меня посчитаны неверно). Затем выхожу-вхожу (т.е. повторно отображаю CPlayingFormType1), CPlayingFormType1::resizeEvent уже НЕ срабатывает (даже если я изменил размеры окна), но тут геометрия боковых виджетов становится нормальной (т.е. я узнаю истинноеих положение). Щас приведу код
Вот на этот момент (пусть это будет все-таки виджет) CPlayingFormType1 отображен. А виджет CMainForm спрятан. Но если пытаться изменять размеры окна, то ничего не происходит. Нет вызова CPlayingFormType1::resizeEvent. А должен быть по идее и нужен, потому что вместе с изменением размеров окна, все виджеты из CPlayingFormType1 должны также двигаться. Короче вообще ничего не понятно.... Может я как-то не так делаю? Как можно сделать, чтобы по сути на форму QMainWidget по очереди отображался то один, то другой дочерние виджеты (по сути состоящие из многих других виджетов), но так чтобы в момент, когда один виджет отображается, ресайз окна работает для него (т.е. у этого дочернего виджета все меняется). А когда другой виджет отображен - то у него... ---------------------------------- Всё, не читайте это плиз )))) дело было в том, что я чето эксперементировал и написал строчку такую this->setFixedSize(this->size()); в CPlayingFormType1. Вот все лэйауты и отвалились после такого вызова... да, 1.5 дня искал ошибку Сообщение отредактировал Rocky - 18.2.2010, 22:59 |
|
|
Текстовая версия | Сейчас: 27.12.2024, 3:30 |