Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Sahab от Март 31, 2010, 20:28



Название: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 20:28
Как сделать пропорциональный ресайз виджетов... чтоб при ресайзе он всегда сохранял пропорцию сторон (например - квадратным)

heightForWidth не помогает


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Пантер от Март 31, 2010, 20:36
Отлавливай resizeEvent и ставь нужные размеры.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 21:13
можно более расширенно?
каким методом нужно, чтобы не возникала рекурсия?


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Пантер от Март 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 ());
}
 

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


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 21:23
Есть рекурсия


Название: Re: Пропорциональный ресайз виджетов
Отправлено: pastor от Март 31, 2010, 21:24
Пантер, твой код учитывает только резайз по выстоте. Если произойдет ресайз по ширине, код работать не будет


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Пантер от Март 31, 2010, 21:32
Я же написал, что код примерный. Дальше от него отталкиваться и делать как нужно. Нужно учитывать oldSize () и исходя из него подправлять ширину/высоту.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 21:35
РЕКУРСИЯ!!!


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Пантер от Март 31, 2010, 21:40
Винда? Под Линухом глючно, но работает.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 21:46
Да, Винда... и чесно гря непонятно как в юнихе может работать... что в юнихе resize не вызывает resizeEvent?


Название: Re: Пропорциональный ресайз виджетов
Отправлено: pastor от Март 31, 2010, 21:48
Чесно сказать непойму, где может быть рекурсия если сравнивать size() и oldSize(). Это условие выхода из рекурсии


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Пантер от Март 31, 2010, 21:55
pastor: я же о чем. Единственное, ресайз будет тормозить.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Март 31, 2010, 21:58
Thanks a lot;

самое обидное что сам oldSize использовал в коде... ???


Название: Re: Пропорциональный ресайз виджетов
Отправлено: niXman от Март 31, 2010, 23:06
мдя...все зависит с какой точки смотреть ;D


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Апрель 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);
}


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Апрель 02, 2010, 09:48
 ???


Название: Re: Пропорциональный ресайз виджетов
Отправлено: dox от Июль 26, 2010, 12:47
Привет. через resizeEvent нормально не будет работать, я столкнулся с таким же вопросом и решил сделать через winEvent. Там я отлавливаю для винды сообщение WM_RESIZED.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Авварон от Июль 26, 2010, 13:25
почему нельзя флагом блокировать повторный резайсз?


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Июль 26, 2010, 16:52
компилябельный пример бросишь?)


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Авварон от Июль 27, 2010, 09:52
Код:
void Dialog::resizeEvent(QResizeEvent *e){
    if (restoringSize) {
        restoringSize = false;
        return;
    }
    QSize oldSize = ...
    restoringSize = true;
    resize(oldSize);
}


Название: Re: Пропорциональный ресайз виджетов
Отправлено: dox от Июль 27, 2010, 10:03
Приветствую. Пробовал и через флаг, кот. не давал ресайзить повторно, но окно все равно уменьшалось автоматически. Хотя выводимые данные дэбаг давали понять что код не доходит до функции resize в обработчике события.


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Авварон от Июль 27, 2010, 10:13
может вечером тогда поковыряюсь, ща нет кути(


Название: Re: Пропорциональный ресайз виджетов
Отправлено: Sahab от Август 18, 2010, 09:35
что кутя не появилась?


Название: Re: Пропорциональный ресайз виджетов
Отправлено: ufna от Август 18, 2010, 12:47
с флагом на "повторный ресайз" не катит, можешь попробовать. Там такие артефакты лезут, что жуть. Проблема в том, что событие это приходит после ресайза окна, это как минимум. Т.е. пользователь может окно двигать как хочет все равно.

получилось только так: http://ufna.ru/2010/08/16/qt-proportional-window-resize-win