Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PulSar.CE3194694 от Апрель 09, 2010, 22:15



Название: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 09, 2010, 22:15
Добрый день!
Есть проблема. Делаю программу на Qt4.6, в ней важно, чтобы размеры окна менялись пропорционально друг другу. Например, у меня есть окно с соотношением сторон 16:9. Я меняю, допустим, ширину окна, и хочу, чтобы и высота тоже поменялась согласно соотношению. Тоже и с высотой. Вот не знаю как это сделать. В справке никаких методов для этого не нашел. А если в справки и есть подобные функции, то не понятно как работают. И как самому сделать, тоже без понятия. Вроде написал что-то, а работает через...  Я подозреваю, что нужно использовать методы setHeight() и setWidth(). Помогите плиз, написать код для этого.

ЗЫ изменяю размеры главного окна.
Заранее Спасибо.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: alexman от Апрель 09, 2010, 22:16
Уже обсуждалось! Поищи по форуму!


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 09, 2010, 22:33
Посмотрел, тема-то одна, да и то не решенная. Примерно подобный код делал, но приложение из-за него начинает так тормозить при ресайзе окна. Плюс появляется бесконечное уменьшение окна. Что делать?


Название: Re: Пропорциональное изменение размеров окна
Отправлено: break от Апрель 10, 2010, 00:31
может так:


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 10, 2010, 19:54
Спасибо! Работает и без тормозов. Единственное что не устраивает, это возможность изменения только ширины. А высоту тоже нужно сделать изменяемой. Можно ли это как исправить? :)


И почему для QWidget нет функций setHeight() и setWidth()??


Название: Re: Пропорциональное изменение размеров окна
Отправлено: break от Апрель 10, 2010, 19:56
Цитировать
Спасибо! Работает и без тормозов. Единственное что не устраивает, это возможность изменения только ширины.
имеешь ввиду возм. пропорционального изменения размера таская за правый бок или уголок внизу? Ведь и ширина и высота должна меняться.

Сделать чтобы можно было таскать и за нижний и верхний края думаю можно по аналогии.

Все методы по установке размеров для виджета ищи в geometry()


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 10, 2010, 22:42
Просто в коде записано setFixedHeight(.......). Когда приложение запускаем, то за низ растянуть окно нельзя. Потому что высота фиксирована. По аналогии я делал и с высотой - setFixedWidth(.......). Но если эти две функции обе написать, то окно вообще нельзя будет растянуть. Размеры фиксированы. Поэтому и спрашиваю, почему нет функций setHeight() и setWidth().


Название: Re: Пропорциональное изменение размеров окна
Отправлено: break от Апрель 10, 2010, 23:07
Код
C++ (Qt)
QRect rect = geometry();
rect.setHeight( event->size().width() / m_fScaleFactor );
setGeometry( rect );
 


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


Название: Re: Пропорциональное изменение размеров окна
Отправлено: KuZ от Апрель 11, 2010, 00:07
может так:


Странно как-то может это только у меня, но когда изменил размер запущенной проги то размер "плавно" изменяет свой размер на начальный. 


Название: Re: Пропорциональное изменение размеров окна
Отправлено: break от Апрель 11, 2010, 00:12
А вполне возможно что не только у вас так - какая система? Я пробовал в Linux - может этот метод в Windows вообще не покатит...


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 11, 2010, 07:38
Это не странно. При растяжении он вновь возвращает высоту к фиксированной. Кстати если использовать setMinimumHeight(), то размер остается, только вот окно уже не сожмешь....))

ЗЫ Я на Семерке.
ЗЫЫ Код с Qrect не работает((


Название: Re: Пропорциональное изменение размеров окна
Отправлено: shirushizo от Апрель 12, 2010, 06:49
Переопредели resizeEvent()  ;)


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 12, 2010, 20:53
Так так и делаю, не помогает.
Нет команд, которые непосредственно задают по отдельности ширину и высоту окна. Какие хочешь, не только фиксированные и минимальные.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: shirushizo от Апрель 13, 2010, 06:49
Так
this->resize(event->size().width(),event->size().width()*9/16);
или так:
this->resize(event->size().height()*16/9,event->size());

только надо будет QEvent::ignore() куда-то вставить, а то endless loop схавтишь


Название: Re: Пропорциональное изменение размеров окна
Отправлено: PulSar.CE3194694 от Апрель 13, 2010, 19:05
Спасибо, попробую.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: dox от Июль 23, 2010, 17:51
Приветствую. Код что с resize вызывает рекурсию. Кто может подсказать куда копать чтобы сделать пропорциональный ресайз окна?
Спасибо.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: dox от Июль 23, 2010, 21:14
Код:
void mwindow::resizeEvent(QResizeEvent *event)
{

    QSize newSize = event->size();
    QSize oldSize = event->oldSize();

    if(!newSize.isValid() || !oldSize.isValid()){
            return;
    }
    if(newSize == oldSize || newSize == s)
     {
         
        return;                               
    }

 
    qDebug("wN=%d hN=%d wO=%d hO=%d",newSize.width(),newSize.height(),oldSize.width(),oldSize.height());

    oldSize.setWidth(newSize.width());
   oldSize.setHeight(newSize.width());

 
//QApplication::processEvents();
    s = oldSize;
   resize(oldSize);

 

QDialog::resizeEvent(event);
}

Вот код. но при выполнении окно уменьшается до исходных размеров плюс один. Причем одна особенность проявляется при просмотре дэбаг вывода: сообщения resize вызываются после того как отпущена кнопка мыши после ресайза. Причем в любом случае ресайз происходит на 1 пиксел. Если раскоментить QApplication::processEvents();, то ресайз при увеличении окна срабатывает нормально при отпускании клавиши. Однако при уменьшении выдает ошибку. Кто что думает по этому вопросу?


Название: Re: Пропорциональное изменение размеров окна
Отправлено: JamS007 от Июль 23, 2010, 23:59
Вот, от нечего делать написал вам примерчик. На идеальность не претендую :) Писал в пятницу вечером. Тестил только под линуксом.

Из-за рекурсии иногда притормаживает, но это, думаю, можно победить. Мне просто уже спать охота :)


Название: Re: Пропорциональное изменение размеров окна
Отправлено: dox от Июль 24, 2010, 07:46
Приветствую. Попробовал пример, не работает. Думаю что вообще говоря вызов resize  из resizeEvent не оч. хорошая идея. Как я понял resizeEvent вызывается когда размеры уже заданы для окна. Если у кого есть работающий пример, давайте его в вики выложим. Сейчас я изучаю вариант ресайза через winEventFilter.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: dox от Июль 24, 2010, 11:02
Вопрос решил с помощью winEvent для виджета.


Название: Re: Пропорциональное изменение размеров окна
Отправлено: ufna от Октябрь 29, 2010, 15:17
Вышел через поиск. Для этих же целей: http://ufna.ru/2010/08/16/qt-proportional-window-resize-win