Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Событие отрисовки QWidget  (Прочитано 4977 раз)
v1ctor
Гость
« : Август 10, 2011, 09:22 »

Здравствуйте! У меня такая проблема:
Есть несколько контролов в зависимости от локали нужно делать перерасчет координат некоторых из них. Все объекты изначально задаются динамически (накидываются в лейауты).
У меня никак не получается найти место где все виджеты уже рассчитали свои размеры но еще не отрисовались. Можно ли как нибудь вручную заставить виджет пересчитать свои размеры и размеры потомков? Или может быть есть какой то event, что виджет пересчитался?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 10, 2011, 09:27 »

Вообще, если используешь лайоты, все должно происходить автоматически.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
v1ctor
Гость
« Ответ #2 : Август 10, 2011, 09:33 »

Так то да. Но в языках отличных от английского из-за размера текста нужно пересчитать spacing и margin некоторых виджетов, а для этого нужно знать координаты. mapToGlobal выдает нулевые координаты если пытаюсь пересчитать до отрисовки и естественно контролы скачут если пересчитываю после нее. А где считаются координаты контролов я локализовать не могу...
Записан
Kolobok
Гость
« Ответ #3 : Август 10, 2011, 09:59 »

Это теоретический интерес или проблема существует?
Записан
v1ctor
Гость
« Ответ #4 : Август 10, 2011, 10:30 »

Существует. Перечитал пол http://doc.qt.nokia.com/ т.к. не нашел решил спросить совета здесь. Вобщем главное нужно знать в какой момент отрисовывается виджет или когда у него уже посчитаны все размеры.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Август 10, 2011, 10:59 »

Вобщем главное нужно знать в какой момент отрисовывается виджет или когда у него уже посчитаны все размеры.
По идее после вызова QWidget::adjustSize(), который делается в show().
Но нужно иметь в виду, что полученный размер после вызова adjustSize() не всегда будет соответствовать полученному. Всё зависит от зависимостей лейаутов и размеров главного окна.
Есть 100%-ный, но немного непростой способ. Нужно перегрузить showEvent() top-level окна (либо повесить eventFilter()), в котором после вызова базового showEvent() будут окончательные размеры.

Так то да. Но в языках отличных от английского из-за размера текста нужно пересчитать spacing и margin некоторых виджетов, а для этого нужно знать координаты. mapToGlobal выдает нулевые координаты если пытаюсь пересчитать до отрисовки и естественно контролы скачут если пересчитываю после нее. А где считаются координаты контролов я локализовать не могу...
Если компановка у вас зависит от размера текста, то явно с ней что-то не то. Нужно пересмотреть дизайн форм.
Записан

Qt 5.11/4.8.7 (X11/Win)
Kolobok
Гость
« Ответ #6 : Август 10, 2011, 11:21 »

Проблема со стандартными виджетами или с самописными?
Записан
v1ctor
Гость
« Ответ #7 : Август 10, 2011, 12:31 »

Если компановка у вас зависит от размера текста, то явно с ней что-то не то. Нужно пересмотреть дизайн форм.

К сожалению ничего не могу поделать, работаю в отделе локализации а не дизайна.

Проблема со стандартными виджетами или с самописными?

Да проблемы то с виджетами нет, хотя как правильно вы подметили они самописные. Они нормально рисуются и работают, просто я немного не могу сообразить на каком этапе я должен пересчитать координаты. Попробую как предложил GreatSnake, спасибо.
Записан
Kolobok
Гость
« Ответ #8 : Август 10, 2011, 12:36 »

Переопредели для своих виджетов
Код:
int QWidget::heightForWidth ( int w ) const [virtual]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 23.