crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите пожалуйста разобраться с 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 делать так:
parentWidget()->setLayout(this->verticalLayout_6);

Не помогает. verticalLayout_6 - это "главный лэйаут" CPlayingFormType1... (
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.2.2010, 21:49
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9637
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 769 раз(а)




Репутация:   94  


Цитата(Rocky @ 19.2.2010, 0:31) *
Во всех 3-х классах переопределен resizeEvent
а для чего тебе этот обработчик.
Я до конца не понял, ты используешь термин "Форма", ты подразумеваешь под этим самостоятельное окно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 18.2.2010, 22:59
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(Litkevich Yuriy @ 18.2.2010, 21:49) *
а для чего тебе этот обработчик.


На самом деле там ноги растут дальше. В центре CPlayingFormType1 расположены несколько виджетов. Вот эта форма. Вот этим виджетам по середине я задаю фиксированный размер какой-то (задается извне). Видно, что по бокам тоже находятся виджеты. И они связаны лэйаутом. Т.е. их размеры тоже должны меняться при изменении этих виджетов в середине. И в момент, когда я изменяю размер срединных виджетов, мне надо знать положение этих боковых виджетов. А вызов geometry() этих боковых виджетов возвращает старые размеры. Т.е. даже если я вызову updateGeometry для вообще всей этой формы (CPlayingFormType1), геометрия этих боковых виджетов все равно остается старой (на этот момент. Она изменится только один раз, при повторном отображении CPlayingFormType1, см. ниже). Вобщем, копался-копался, и выяснил что resizeEvent ни у CPlayingFormType1 ни у одного из ее дочерних виджетов не вызывается вообще. Она вызывается только один раз при самом первом появлении CPlayingFormType1 на экране... Потом хоть что делай, она не вызывается. Соответственно я могу хоть как именить геометрию окна, а виджеты в CPlayingFormType1 остаются на своих местах.

Цитата(Litkevich Yuriy @ 18.2.2010, 21:49) *
Я до конца не понял, ты используешь термин "Форма", ты подразумеваешь под этим самостоятельное окно?

ну как бы есть форма смысле в дизайнере сделал. Создал класс производный от нее и от QWidget (это есть CPlayingFormType1). У этого класса родитель QMainWidget (которой в предыдущем посте я обозвал "главная форма"). И соответсвенно есть еще CMainForm (по сути ничем не отличающийся от CPlayingFormType1). Просто ресайз делается для CMainForm, а для CPlayingFormType1 нет. Вот в этом и беда((

Цитата(Я)
Она изменится только один раз, при повторном отображении CPlayingFormType1, см. ниже). ............. Она вызывается только один раз при самом первом появлении CPlayingFormType1

Вот тут не противоречие, а так и есть. Т.е. при первом появлении CPlayingFormType1::resizeEvent срабатывает, потом я изменяю размер серединным виджетам, якобы все обновляю (через updateGeometry), затем запрашиваю размеры боковым виджетам, но получаю старые размеры (хотя при выходе из отладчика смотрю на прогу и вижу эти боковые виджеты как они и должны быть - размеры-то у меня посчитаны неверно). Затем выхожу-вхожу (т.е. повторно отображаю CPlayingFormType1), CPlayingFormType1::resizeEvent уже НЕ срабатывает (даже если я изменил размеры окна), но тут геометрия боковых виджетов становится нормальной (т.е. я узнаю истинноеих положение).

Щас приведу код

//в конструкторе класса-наследника от QMainWidget
m_pMainForm = new CMainForm(this, m_pErrorLog, this);
m_pPlayingForm = new PlayModules::CPlayingFormType1(this, m_pErrorLog, this);


//в конструкторе CMainForm
m_pGameMenu_1 = new CGameMenu_1(m_pGameMenuWidget);


//в обработчике нажатия на кнопку старта игры в CGameMenu_1
//1)"прячем" CMainForm
parentWidget()->parentWidget()->setVisible(false);//1-й парент это m_pGameMenuWidget, 2-й - это сам CMainForm

//2) не совсем явный вызов m_pPlayingForm указателя, но смысла нет приводить код, там через цепочку запросов происходит вот это
//т.е. отображаем CPlayingFormType1
m_pPlayingForm->ShowLayout();

//далее
CPlayingFormType1::ShowLayout()
{
this->show();//вот в этот момент происходит вызов CPlayingFormType1::resizeEvent

//потом я изменяю серединные виджеты (setFixedSize), и делаю вызов CPlayingFormType1::updateGeometry(), который ни к чему не приводит
//и далее я должен на основании [b]нового[/b] положения боковых виджетов запомнить и рассчитать нужные координаты. Но геометрия боковых виджетов [b]старая[/b].
}


Вот на этот момент (пусть это будет все-таки виджет) CPlayingFormType1 отображен. А виджет CMainForm спрятан. Но если пытаться изменять размеры окна, то ничего не происходит. Нет вызова CPlayingFormType1::resizeEvent. А должен быть по идее и нужен, потому что вместе с изменением размеров окна, все виджеты из CPlayingFormType1 должны также двигаться. Короче вообще ничего не понятно....

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

----------------------------------


Всё, не читайте это плиз ))))
дело было в том, что я чето эксперементировал и написал строчку такую


this->setFixedSize(this->size());
в CPlayingFormType1. Вот все лэйауты и отвалились после такого вызова... да, 1.5 дня искал ошибку

Сообщение отредактировал Rocky - 18.2.2010, 22:59
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.6.2018, 9:33