crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Назначение sizeHint()
wf778899
  опции профиля:
сообщение 3.8.2014, 13:48
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем. Не могу разобраться с sizeHint(). Как я понял, эта функция используется классами Layout для подгонки размеров окна главного виджета. Решил проверить - не работает. Что-то я не так делаю. Код ниже.

Этот виджет просто рисует квадратик 100Х100. Здесь же я реализовал sizeHint(), возвращающую те же 100X100 пикселей. Если я правильно понял назначение adjustSize(), она должна изменить размеры виджета в соответствии с sizeHint(), т.е. установить размер рисуемого квадрата.

#include "my.h"
#include <QPainter>
#include <QSize>

my::my(QWidget *parent):QWidget(parent) {
    adjustSize();
}

void my::paintEvent(QPaintEvent *) {
    painter = new QPainter(this);
    painter->setBrush(Qt::red);
    painter->drawRect(0, 0, 100, 100);
}

QSize my::sizeHint() {
    return QSize(100, 100);
}

Затем этот виджет я включаю в другой, см. ниже.

#include "charlist.h"
#include "my.h"
#include <QGridLayout>
#include <QPainter>

CharList::CharList(QWidget *parent) : QWidget(parent) {
    test = new my;
    QVBoxLayout *lay1 = new QVBoxLayout;
    lay1->addWidget(test);
    setLayout(lay1);
}


QVBoxLayout, как вещают на других форумах, использует sizeHint() и устанавливает размеры главного окна в соответствии с возвращаемыми ею значениями. Если это так, то где я промахнулся? А если не так, то в чём назначение sizeHint()? Подскажите, пожалуйста.
Причина редактирования: используй тэг code или соответсвующую кнопку на панели редактирования
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 3.8.2014, 15:29
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


sizeHint() определяет рекомендованный размер для виджета. И поэтому размер виджета может быть и отличным от размеров указанных в данной функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wf778899
  опции профиля:
сообщение 3.8.2014, 16:39
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Trisch @ 3.8.2014, 13:29) *
sizeHint() определяет рекомендованный размер для виджета. И поэтому размер виджета может быть и отличным от размеров указанных в данной функции.


Зачем тогда нужна эта функция? Или так спрошу: каким образом можно использовать этот рекомендованный размер? Конкретно в данном примере возможно с помощью sizeHint(), реализованной в дочернем виджете, манипулировать размерами главного виджета или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 3.8.2014, 19:52
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
sizePolicy : QSizePolicy
This property holds the default layout behavior of the widget.

If there is a QLayout that manages this widget's children, the size policy specified by that layout is used. If there is no such QLayout, the result of this function is used.

The default policy is Preferred/Preferred, which means that the widget can be freely resized, but prefers to be the size sizeHint() returns. Button-like widgets set the size policy to specify that they may stretch horizontally, but are fixed vertically. The same applies to lineedit controls (such as QLineEdit, QSpinBox or an editable QComboBox) and other horizontally orientated widgets (such as QProgressBar). QToolButton's are normally square, so they allow growth in both directions. Widgets that support different directions (such as QSlider, QScrollBar or QHeader) specify stretching in the respective direction only. Widgets that can provide scroll bars (usually subclasses of QScrollArea) tend to specify that they can use additional space, and that they can make do with less than sizeHint().

Т.е. зависит от SizePolicy как будет использоваться sizeHint.

Есди вы хотите задать жесткий размер просто выставьте maximum/minimum size или выставьте QSizePolicy::Fixed.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wf778899
  опции профиля:
сообщение 3.8.2014, 20:10
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 3.8.2014, 17:52) *
Цитата
sizePolicy : QSizePolicy
This property holds the default layout behavior of the widget.

If there is a QLayout that manages this widget's children, the size policy specified by that layout is used. If there is no such QLayout, the result of this function is used.

The default policy is Preferred/Preferred, which means that the widget can be freely resized, but prefers to be the size sizeHint() returns. Button-like widgets set the size policy to specify that they may stretch horizontally, but are fixed vertically. The same applies to lineedit controls (such as QLineEdit, QSpinBox or an editable QComboBox) and other horizontally orientated widgets (such as QProgressBar). QToolButton's are normally square, so they allow growth in both directions. Widgets that support different directions (such as QSlider, QScrollBar or QHeader) specify stretching in the respective direction only. Widgets that can provide scroll bars (usually subclasses of QScrollArea) tend to specify that they can use additional space, and that they can make do with less than sizeHint().

Т.е. зависит от SizePolicy как будет использоваться sizeHint.

Есди вы хотите задать жесткий размер просто выставьте maximum/minimum size или выставьте QSizePolicy::Fixed.


Большое спасибо, попробую поиграться..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wf778899
  опции профиля:
сообщение 3.8.2014, 22:02
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 3.8.2014, 17:52) *
Цитата
sizePolicy : QSizePolicy
This property holds the default layout behavior of the widget.

If there is a QLayout that manages this widget's children, the size policy specified by that layout is used. If there is no such QLayout, the result of this function is used.

The default policy is Preferred/Preferred, which means that the widget can be freely resized, but prefers to be the size sizeHint() returns. Button-like widgets set the size policy to specify that they may stretch horizontally, but are fixed vertically. The same applies to lineedit controls (such as QLineEdit, QSpinBox or an editable QComboBox) and other horizontally orientated widgets (such as QProgressBar). QToolButton's are normally square, so they allow growth in both directions. Widgets that support different directions (such as QSlider, QScrollBar or QHeader) specify stretching in the respective direction only. Widgets that can provide scroll bars (usually subclasses of QScrollArea) tend to specify that they can use additional space, and that they can make do with less than sizeHint().

Т.е. зависит от SizePolicy как будет использоваться sizeHint.

Есди вы хотите задать жесткий размер просто выставьте maximum/minimum size или выставьте QSizePolicy::Fixed.


Не, что-то опять фигня вышла. Проверьте, пожалуйста, правильно ли я написал:

Это дочерний виджет, в нём я рисую квадрат 300Х300 и устанавливаю SizePolicy по вертикали и по горизонтали "Fixed" (в конструкторе хоть по умолчанию и стоит "Fixed", но я прописал на всякий случай).

#include "my.h"
#include <QPainter>
#include <QPaintEvent>
#include <QSize>
#include <QSizePolicy>

my::my(QWidget *parent):QWidget(parent) {
QSizePolicy policy(QSizePolicy::Fixed, QSizePolicy::Fixed);
setSizePolicy(policy);
}

void my::paintEvent(QPaintEvent *) {
painter = new QPainter(this);
painter->setBrush(Qt::yellow);
painter->drawRect(0,0,300,300);
}

QSize my::sizeHint() {
return QSize(400, 400);
}

Теперь при занесении виджета в слой главного виджета по идее его размеры должны подхватываться из sizeHint(), т.е. 400Х400, но этого не происходит... Главный виджет вот такой:

#include "charlist.h"
#include "my.h"
#include <QVBoxLayout>
#include <QScrollArea>
#include <QPainter>

CharList::CharList(QWidget *parent) : QWidget(parent) {
setFixedSize(500, 500);
test = new my;
QVBoxLayout *box = new QVBoxLayout;
box->addWidget(test, 1);
setLayout(box);
}

При запуске главный виджет пустой, его размеры 100Х100 (откуда?!). Если поменять Fixed на Preferred - квадрат рисуется, но размеры главного виджета теже самые - 100Х100. Что тут может быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 5.8.2014, 21:07
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Ваш переопределенный sizeHint никогда не вызывается, потому что сигнатура sizeHint:
virtual QSize    sizeHint() const

А у вас без const.

Policy необязательно переопределять, у меня заработало из коробки.

Сообщение отредактировал lanz - 5.8.2014, 21:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.8.2014, 6:24
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(wf778899 @ 3.8.2014, 19:39) *
возможно с помощью sizeHint(), реализованной в дочернем виджете, манипулировать размерами главного виджета или нет?
кроме того, что сказал lanz, добавлю:
на размеры главного окна влияют и значения возвращаемые функцией QWidget::minimumSizeHint(), подробнее здесь

wf778899, используй тэг code для форматирования фрагментов исходного кода
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wf778899
  опции профиля:
сообщение 8.8.2014, 19:27
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 20.7.2014
Пользователь №: 4191

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 5.8.2014, 20:07) *
Ваш переопределенный sizeHint никогда не вызывается, потому что сигнатура sizeHint:
virtual QSize    sizeHint() const

А у вас без const.

Policy необязательно переопределять, у меня заработало из коробки.


Да, заработало... Как я пропустил такую мелочь... Спасибо всем!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 2:42