Название: Событие отрисовки QWidget Отправлено: v1ctor от Август 10, 2011, 09:22 Здравствуйте! У меня такая проблема:
Есть несколько контролов в зависимости от локали нужно делать перерасчет координат некоторых из них. Все объекты изначально задаются динамически (накидываются в лейауты). У меня никак не получается найти место где все виджеты уже рассчитали свои размеры но еще не отрисовались. Можно ли как нибудь вручную заставить виджет пересчитать свои размеры и размеры потомков? Или может быть есть какой то event, что виджет пересчитался? Название: Re: Событие отрисовки QWidget Отправлено: Пантер от Август 10, 2011, 09:27 Вообще, если используешь лайоты, все должно происходить автоматически.
Название: Re: Событие отрисовки QWidget Отправлено: v1ctor от Август 10, 2011, 09:33 Так то да. Но в языках отличных от английского из-за размера текста нужно пересчитать spacing и margin некоторых виджетов, а для этого нужно знать координаты. mapToGlobal выдает нулевые координаты если пытаюсь пересчитать до отрисовки и естественно контролы скачут если пересчитываю после нее. А где считаются координаты контролов я локализовать не могу...
Название: Re: Событие отрисовки QWidget Отправлено: Kolobok от Август 10, 2011, 09:59 Это теоретический интерес или проблема существует?
Название: Re: Событие отрисовки QWidget Отправлено: v1ctor от Август 10, 2011, 10:30 Существует. Перечитал пол http://doc.qt.nokia.com/ т.к. не нашел решил спросить совета здесь. Вобщем главное нужно знать в какой момент отрисовывается виджет или когда у него уже посчитаны все размеры.
Название: Re: Событие отрисовки QWidget Отправлено: GreatSnake от Август 10, 2011, 10:59 Вобщем главное нужно знать в какой момент отрисовывается виджет или когда у него уже посчитаны все размеры. По идее после вызова QWidget::adjustSize(), который делается в show().Но нужно иметь в виду, что полученный размер после вызова adjustSize() не всегда будет соответствовать полученному. Всё зависит от зависимостей лейаутов и размеров главного окна. Есть 100%-ный, но немного непростой способ. Нужно перегрузить showEvent() top-level окна (либо повесить eventFilter()), в котором после вызова базового showEvent() будут окончательные размеры. Так то да. Но в языках отличных от английского из-за размера текста нужно пересчитать spacing и margin некоторых виджетов, а для этого нужно знать координаты. mapToGlobal выдает нулевые координаты если пытаюсь пересчитать до отрисовки и естественно контролы скачут если пересчитываю после нее. А где считаются координаты контролов я локализовать не могу... Если компановка у вас зависит от размера текста, то явно с ней что-то не то. Нужно пересмотреть дизайн форм.Название: Re: Событие отрисовки QWidget Отправлено: Kolobok от Август 10, 2011, 11:21 Проблема со стандартными виджетами или с самописными?
Название: Re: Событие отрисовки QWidget Отправлено: v1ctor от Август 10, 2011, 12:31 Если компановка у вас зависит от размера текста, то явно с ней что-то не то. Нужно пересмотреть дизайн форм. К сожалению ничего не могу поделать, работаю в отделе локализации а не дизайна. Проблема со стандартными виджетами или с самописными? Да проблемы то с виджетами нет, хотя как правильно вы подметили они самописные. Они нормально рисуются и работают, просто я немного не могу сообразить на каком этапе я должен пересчитать координаты. Попробую как предложил GreatSnake, спасибо. Название: Re: Событие отрисовки QWidget Отправлено: Kolobok от Август 10, 2011, 12:36 Переопредели для своих виджетов
Код: int QWidget::heightForWidth ( int w ) const [virtual] |