Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: pakulo от Июнь 28, 2007, 08:45



Название: sizeHint
Отправлено: pakulo от Июнь 28, 2007, 08:45
Этот параметр означает рекомендованный размер виджета...
Т.е. если я переопределяют его создавая свой виджет и устанавливаю там return QSize(20, 20); Это не означает что мой виджет будет иметь такой максимальный размер?


Название: sizeHint
Отправлено: Steven_Orko от Июнь 28, 2007, 09:06
Не значит. Посмотри заодно значение политик QSizePolicy. Там при одних значениях  sizeHint() используется, при других игнорируется.


Название: sizeHint
Отправлено: Racheengel от Июнь 28, 2007, 09:21
А никто не пробовал делать sizeHint() динамическим? Т.е. чтобы размер виджета менялся при изменениях его контента. У меня такое чувство, что этот хинт корректно применяется только при конструировании виджета, т.к. если я пытаюсь менять его по ходу работы приложения - то размеры виджета остаются прежними...


Название: sizeHint
Отправлено: goer от Июнь 28, 2007, 09:34
Может быть.. особенно есл учесть что есть только функция чтения свойства(нет же setSizeHint), то можно интуитивно предположить что функция должна возвращать константу.


Название: sizeHint
Отправлено: Racheengel от Июнь 28, 2007, 10:27
похоже, только setFixedSize() спасет отца русской демократии...


Название: sizeHint
Отправлено: goer от Июнь 28, 2007, 10:37
Меня еще другое убивает: устанавливаю геометрию для захайденого виджета. Потом показываю его: ширина устанавливается нормально, высота остается неизменной. Хайдю. Показываю снова. Со второго показа наконецто получаю геометрию которую установил.

При этом для тех виджетов что отображаются, установка геометрии работает, НО тостеры ругаются(да я и сам вижу) - уж очень медлено окошко меняет свою геометрию, что приводит к неприятному визуальному восприятию.

Так что в каком то смысле при определенных условиях установку геометрии тоже можносчитать одноразовой функцией :)))


Название: sizeHint
Отправлено: Racheengel от Июнь 28, 2007, 11:17
Ну это уже баг в Qt. надо репортить.
А вообще, с этими политиками размеров они перемудрили. Хватило бы политик fixed, stretched, max, min, ignored.
(stretched - это допустим если тебе надо виджеты пропорционально растягивать). И еще, minimum и maximum я бы таки местами поменял - по логике, minimum должен занимать минимум места, а не наоборот.


Название: Re: sizeHint
Отправлено: CroCIV от Июль 03, 2009, 15:05
А никто не пробовал делать sizeHint() динамическим? Т.е. чтобы размер виджета менялся при изменениях его контента. У меня такое чувство, что этот хинт корректно применяется только при конструировании виджета, т.к. если я пытаюсь менять его по ходу работы приложения - то размеры виджета остаются прежними...

Делаем раз:
преобразуем нужный виджет на нашей форме в Qt Designerе в собственный класс, порожденный от базового класса щелкнув по нему правой кнопкой миши и выбрав пункт Promote to и задаем ему <имя>

делаем два: включаем (создаем) в проект <имя>.h и <имя>.cpp файлы
и описываем их по примеру (если у кого-то с этим проблемы):

Код:
#ifndef QTABLEVIEWVARSIZEHINT_H
#define QTABLEVIEWVARSIZEHINT_H

#include <QTableView>

class QTableViewVarSizeHint : public QTableView
{
Q_OBJECT

public:
QTableViewVarSizeHint(QWidget *parent = 0);
~QTableViewVarSizeHint();
QSize sizeHint() const;
void setSizeHint(QSize newSizeHint);

private:
QSize mySizeHint;
};

#endif // QTABLEVIEWVARSIZEHINT_H


#include <QtGui>
#include "qtableviewvarsizehint.h"

QTableViewVarSizeHint::QTableViewVarSizeHint(QWidget *parent)
: QTableView(parent)
{

}

QTableViewVarSizeHint::~QTableViewVarSizeHint()
{

}
void QTableViewVarSizeHint::setSizeHint(QSize newSizeHint)
{
mySizeHint = newSizeHint;
}

QSize QTableViewVarSizeHint::sizeHint() const
{
return mySizeHint;
}

готово, наслаждаемся виджетом, с манипулируемой функцией sizeHint(). теперь устанавливая переменнею mySizeHint и вызывая функцию adjustSize() у формы владельца виджета с умилением наблюдаем желаемое, т.к. adjustSize() родителя для расположения на своей форме всех дочерних виджетов вызывает у них sizeHint().

Как вариант можно не вводить функцию setSizeHint(QSize newSizeHint) и переменную mySizeHint, а сразу вычислять и выдавать необходимый размер, но такой код мне показался гибче, хоть и вызовов больше.

З.Ы.: ура теперь я тоже пишу на Qt, наконец-то!!!