QSizePolicy истинное значение, документация и мысли

Я уже два года глубоко работаю с системой компоновки Qt. После этого времени я столкнулся с тысячами проблем с SizePolicies и Layouts. Обычно я находил решения, но никогда не понимал, что делаю.

Теперь я потратил некоторое время, чтобы попытаться правильно понять и создать для них 101 РУКОВОДСТВО и никогда не ошибаться. Я узнал эту информацию в документации о QSizePolicy QWidget:

Это свойство содержит поведение макета виджета по умолчанию.

Если есть QLayout, который управляет дочерними элементами этого виджета, используется политика размера, указанная этим макетом. Если такого QLayout нет, используется результат этой функции.

Я думал, что если у вас есть, например, QLabel, и вы устанавливаете политики на Horizontal Expanding, Vertical Fixed, сама ЭТИКЕТКА изменится таким образом. Но это совсем не так.

Читая это, я вижу, что внутри МАКЕТА говорится о ЕГО ДЕТЯХ. Так что же это значит? Внутри этикетки ничего нет, поэтому она не работает?

Как насчет того, чтобы вставить метку внутрь QFrame и указать, что фрейм расширяется... Будет ли расширяться или растягиваться QFrame (в зависимости от остальных виджетов-братьев в том же макете) или будет расширяться или растягиваться метка, а не QFrame?

Какой беспорядок...

Как насчет растяжки? Если вы установите растяжение 10 при добавлении виджета:

layout->addwidget(label, 10, Qt::AlignHCenter);

Это тоже не работает.

Растянуть 0 при добавлении виджета означает: Принять политики, которые я вам сказал. По умолчанию, зависит от типа виджета. Кнопочные виджеты имеют фиксированное расширение. Коробчатая расширяющаяся-расширяющаяся...

Stretch 10 означает: расти максимально.

Я прав? Что ж. Когда внутри есть QFrame и QLabel, установка Expanding и 10 для растяжения метки НЕ РАБОТАЕТ.


person Darkgaze    schedule 29.01.2014    source источник
comment
ты написал это руководство?   -  person Tomek Wyderka    schedule 29.03.2015
comment
Неа. Все еще нет... но у меня есть все те заметки, которые я делал, когда интенсивно работал с Qt. Я должен сделать это :(   -  person Darkgaze    schedule 08.04.2015
comment
На самом деле я только что провел небольшое исследование этой проблемы и обнаружил, что QSizePolicy имеет отношение только к sizeHint и ни к чему другому! Документация QT вводит в заблуждение... Вот мои заметки: cofoh.com/layouts- и-sizepolicy-qt   -  person Tomek Wyderka    schedule 08.04.2015
comment
Томек, ты прав. Это так отвратительно. Я хотел бы сделать огромный путеводитель для людей. К сожалению, я сейчас очень далеко от этого места. Жаль, что я не сделал это раньше... я посмотрю свои заметки об этом...   -  person Darkgaze    schedule 14.04.2015


Ответы (1)


Я не понимаю всех ваших вопросов, поэтому отвечу только на те, которые, как мне кажется, я понимаю.

  • Я думал, что если у вас есть QLabel, например, и вы устанавливаете политики на Горизонтальное расширение, Вертикальное фиксированное, сама ЭТИКЕТКА изменится таким образом. Но это совсем не так.

Я не знаю, что это значит. Какого точного поведения вы ожидаете и что на самом деле происходит? Эта этикетка в макете? Есть ли другие виджеты в этом макете?

  • Как насчет вставки метки внутрь QFrame и сообщения фрейму, что он расширяется...

Если вы установите QSizePolicy для своего объекта QFrame и установите для него макет, эта политика размера может быть проигнорирована. Документы: Если есть QLayout, который управляет дочерними элементами этого виджета, используется политика размера, указанная этим макетом. Если такого QLayout нет, используется результат этой функции. Это означает, что макет виджета должен управлять размером виджета. Обратите внимание, что он по-прежнему будет учитывать минимальные/максимальные значения ширины/высоты.

  • Растянуть на 10 означает: расти максимально.

Что заставляет вас думать, что?. Коэффициент растяжения зависит от других виджетов внутри макета. документы: используются коэффициенты растяжения чтобы изменить количество места, отводимого виджетам пропорционально друг другу.

  • Если внутри есть QFrame и QLabel, настройка Expanding и 10 для растягивания до метки НЕ РАБОТАЮТ.

Не работает как? Если вы установите для QFrame значение 1, а для QLabel значение 10, ваш объект QLabel всегда должен быть в 10 раз шире/высотой (в зависимости от типа макета), чем ваш объект QFrame. Если ваш QFrame имеет макет и содержит дочерние элементы, это может не сработать, поскольку это будет зависеть от политики размера дочерних элементов.

person thuga    schedule 30.01.2014
comment
Спасибо за Ваш ответ. Я не могу проверить то, что вы просили и сказали мне сделать. Я проверю ответ, когда проверю. у меня есть напоминание - person Darkgaze; 12.02.2014