Назначение sizeHint() |
Здравствуйте, гость ( Вход | Регистрация )
Назначение sizeHint() |
wf778899 |
3.8.2014, 13:48
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 20.7.2014 Пользователь №: 4191 Спасибо сказали: 0 раз(а) Репутация: 0 |
Привет всем. Не могу разобраться с sizeHint(). Как я понял, эта функция используется классами Layout для подгонки размеров окна главного виджета. Решил проверить - не работает. Что-то я не так делаю. Код ниже.
Этот виджет просто рисует квадратик 100Х100. Здесь же я реализовал sizeHint(), возвращающую те же 100X100 пикселей. Если я правильно понял назначение adjustSize(), она должна изменить размеры виджета в соответствии с sizeHint(), т.е. установить размер рисуемого квадрата.
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 |
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 |
Цитата 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 |
Цитата 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:
А у вас без const. Policy необязательно переопределять, у меня заработало из коробки. Сообщение отредактировал lanz - 5.8.2014, 21:07 |
|
|
Litkevich Yuriy |
8.8.2014, 6:24
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
возможно с помощью sizeHint(), реализованной в дочернем виджете, манипулировать размерами главного виджета или нет? кроме того, что сказал lanz, добавлю:на размеры главного окна влияют и значения возвращаемые функцией QWidget::minimumSizeHint(), подробнее здесь wf778899, используй тэг code для форматирования фрагментов исходного кода |
|
|
wf778899 |
8.8.2014, 19:27
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 20.7.2014 Пользователь №: 4191 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
Текстовая версия | Сейчас: 26.4.2024, 2:42 |