Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alp от Июня 03, 2010, 17:21



Название: CSS, на этот раз +margin/padding
Отправлено: Alp от Июня 03, 2010, 17:21
Описываю в CSS стили виджетов, при этом меняю их отступы, внешние и внутренние (margin/padding) и предполагаю, что при обновлении стиля виджет перепозиционируется в лайауте, соотвественно margin'ам и внутри него перепозиционируются дети согласно padding'ам. Ан нет! Лайаут как был так и не изменился, хотя маржины и виджета изменились и он выглядит меньше. С паддингами еще хуже - вообще никакого видимого изменения не произошло.

Читаю документацию, нахожу, что:
Sub-controls are always positioned with respect to another element - a reference element. This reference element could be the widget or another Sub-control. For example, the ::drop-down of a QComboBox is placed, by default, in the top right corner of the Padding rectangle of the QComboBox. The ::drop-down is placed, by default, in the Center of the Contents rectangle of the ::drop-down Sub-control. See the List of Stylable Widgets below for the Sub-controls to use to style a widget and their default positions.
Код
C++ (Qt)
QComboBox {
    margin-right: 20px;
}
QComboBox::drop-down {
    subcontrol-origin: margin;
}

Вкратце и насколько я понял, для верного позиционирования детей надо указать ориджин, потому, что по умолчанию дети позиционируются относительно чего-то фиксированного (может быть маржина). Добавляю всем потомкам указанный "сабконтрол-ориджин" переводящий начало на паддинг - результата 0.

Можно ли вообще и если да, то как использовать паддинги и маржины через CSS, в случае, когда виджеты лежат в лайауте?


Название: Re: CSS, на этот раз +margin/padding
Отправлено: Alp от Июня 04, 2010, 16:40
Что бы не забыть - посмотрим на реакцию.
http://bugreports.qt.nokia.com/browse/QTBUG-11231


Название: Re: CSS, на этот раз +margin/padding
Отправлено: Alp от Июня 07, 2010, 10:59
Проблема оказалась в том, со слов троллей, что обновления стиля (style()->polish(this)) не сбрасывает кэш хинтов размера. Действительно, setStyleSheet(this->styleSheet()) даже при пустой таблице стилей проблему решает.


Название: Re: CSS, на этот раз +margin/padding
Отправлено: Alp от Июня 07, 2010, 11:04
Остался один вопрос - при установке маржинов (в тестовом проекте надо кликнуть два раза по любой кнопке) нарушается (нарушается ли???) определение границ виджета. Что это значит? Это значит, что границы виджета простираются за его видимыми пределами. Т.е. при попадании указателя мыши в пределы прямоугольника ограничиваемого маржинами срабатывает enterEvent.

С одной стороны это согласно документации, потому, как "When using style sheets, every widget is treated as a box with four concentric rectangles". С другой стороны, с точки зрения здравого смысла, получается какая-то кривота.


Название: Re: CSS, на этот раз +margin/padding
Отправлено: lit-uriy от Июня 07, 2010, 15:02
по поводу последнего:
Может всё таки виджет больше, чем ты думаешь?
Так происходит когда виджет имеет фиксированный размер, помещён в компоновщик, а родительский виджет растянут.
При этом визуально виджет не изменяется (допустим выглядит квадратным), но вся прямоугольная область в этой части компоновщика принимает события мыши.
Попробуй залить фон ярким и цветом, тогда станет видно реальный прямоугольник виджета