Russian Qt Forum
Апреля 04, 2025, 14:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: CSS, на этот раз +margin/padding  (Прочитано 3501 раз)
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, в случае, когда виджеты лежат в лайауте?
Записан
Alp
Гость
« Ответ #1 : Июня 04, 2010, 16:40 »

Что бы не забыть - посмотрим на реакцию.
http://bugreports.qt.nokia.com/browse/QTBUG-11231
Записан
Alp
Гость
« Ответ #2 : Июня 07, 2010, 10:59 »

Проблема оказалась в том, со слов троллей, что обновления стиля (style()->polish(this)) не сбрасывает кэш хинтов размера. Действительно, setStyleSheet(this->styleSheet()) даже при пустой таблице стилей проблему решает.
Записан
Alp
Гость
« Ответ #3 : Июня 07, 2010, 11:04 »

Остался один вопрос - при установке маржинов (в тестовом проекте надо кликнуть два раза по любой кнопке) нарушается (нарушается ли???) определение границ виджета. Что это значит? Это значит, что границы виджета простираются за его видимыми пределами. Т.е. при попадании указателя мыши в пределы прямоугольника ограничиваемого маржинами срабатывает enterEvent.

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Июня 07, 2010, 15:02 »

по поводу последнего:
Может всё таки виджет больше, чем ты думаешь?
Так происходит когда виджет имеет фиксированный размер, помещён в компоновщик, а родительский виджет растянут.
При этом визуально виджет не изменяется (допустим выглядит квадратным), но вся прямоугольная область в этой части компоновщика принимает события мыши.
Попробуй залить фон ярким и цветом, тогда станет видно реальный прямоугольник виджета
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.038 секунд. Запросов: 20.