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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Пропорциональный ресайз виджетов  (Прочитано 12370 раз)
Sahab
Гость
« : Март 31, 2010, 20:28 »

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

heightForWidth не помогает
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Март 31, 2010, 20:36 »

Отлавливай resizeEvent и ставь нужные размеры.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sahab
Гость
« Ответ #2 : Март 31, 2010, 21:13 »

можно более расширенно?
каким методом нужно, чтобы не возникала рекурсия?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Март 31, 2010, 21:20 »

Код
C++ (Qt)
void QWidget::resizeEvent ( QResizeEvent * event )
{
 const QSize& size = event->size ();
 if (size.height () != size.width ())
   resize (size.height (), size.height ());
}
 

Примерно так, нужно потестить. По идее, рекурсии быть не должно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sahab
Гость
« Ответ #4 : Март 31, 2010, 21:23 »

Есть рекурсия
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Март 31, 2010, 21:24 »

Пантер, твой код учитывает только резайз по выстоте. Если произойдет ресайз по ширине, код работать не будет
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #6 : Март 31, 2010, 21:32 »

Я же написал, что код примерный. Дальше от него отталкиваться и делать как нужно. Нужно учитывать oldSize () и исходя из него подправлять ширину/высоту.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sahab
Гость
« Ответ #7 : Март 31, 2010, 21:35 »

РЕКУРСИЯ!!!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #8 : Март 31, 2010, 21:40 »

Винда? Под Линухом глючно, но работает.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sahab
Гость
« Ответ #9 : Март 31, 2010, 21:46 »

Да, Винда... и чесно гря непонятно как в юнихе может работать... что в юнихе resize не вызывает resizeEvent?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Март 31, 2010, 21:48 »

Чесно сказать непойму, где может быть рекурсия если сравнивать size() и oldSize(). Это условие выхода из рекурсии
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #11 : Март 31, 2010, 21:55 »

pastor: я же о чем. Единственное, ресайз будет тормозить.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sahab
Гость
« Ответ #12 : Март 31, 2010, 21:58 »

Thanks a lot;

самое обидное что сам oldSize использовал в коде... Непонимающий
Записан
niXman
Гость
« Ответ #13 : Март 31, 2010, 23:06 »

мдя...все зависит с какой точки смотреть Смеющийся
Записан
Sahab
Гость
« Ответ #14 : Апрель 01, 2010, 15:57 »

не работает "нормально"
подскажите где туплю(

Код:
void Dialog::resizeEvent(QResizeEvent *e){
QSize newSize = e->size();
QSize oldSize = e->oldSize();

if(!newSize.isValid() || !oldSize.isValid()){
return;
}
if(newSize == oldSize || newSize == s) { // условие выхода из рекурсии при однаковом новом и старом размере
return;                                    // и при полной установки нового размера (ресайз вызывается для каждой стороны)
}                                                       

oldSize.scale(newWidth, newHeight, Qt::KeepAspectRatioByExpanding);

s = oldSize;

resize(oldSize);
}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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