Russian Qt Forum

Qt => QSS => Тема начата: xokc от Февраль 07, 2012, 22:39



Название: Box model и style sheets
Отправлено: xokc от Февраль 07, 2012, 22:39
В соответствии с http://developer.qt.nokia.com/doc/qt-4.8/stylesheet-customizing.html#box-model
при использовании style sheets каждому виджету можно установить некую box model.
Пусть имеется наследник QWidget в котором переопределен метод paintEvent и установлена следующая таблица стилей:
Код
CSS
margin: 3 7 10 15;
border-width: 3 7 10 15;
padding: 3 7 10 15;
 
Как мне внутри paintEvent определить установленные значения margin, border-width и padding?


Название: Re: Box model и style sheets
Отправлено: andrew.k от Февраль 07, 2012, 23:17
может быть QWidget::style()
Еще такой класс есть QStylePainter

Оттуда два примера (думаю это не то, что нужно, но есть куда копать)
Код
C++ (Qt)
void MyWidget::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
 
    QStyleOptionFocusRect option;
    option.initFrom(this);
    option.backgroundColor = palette().color(QPalette::Background);
 
    style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
}
 
 
void MyWidget::paintEvent(QPaintEvent * /* event */)
{
    QStylePainter painter(this);
 
    QStyleOptionFocusRect option;
    option.initFrom(this);
    option.backgroundColor = palette().color(QPalette::Background);
 
    painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
}

поверхностно знаком с этими классами. Думаю в ассистанте есть примеры. Еще QStyleOption можно глянуть.


Название: Re: Box model и style sheets
Отправлено: xokc от Февраль 07, 2012, 23:24
И где в этих примерах ширина border, margin и padding?
StyleOption тоже не помогает. Там только rect есть и он всегда совпадает с rect() от самого QWidget, т.е. никак не учитывает значений, заданных в style sheet.


Название: Re: Box model и style sheets
Отправлено: andrew.k от Февраль 07, 2012, 23:39
И где в этих примерах ширина border, margin и padding?
StyleOption тоже не помогает. Там только rect есть и он всегда совпадает с rect() от самого QWidget, т.е. никак не учитывает значений, заданных в style sheet.
Я думаю, drawPrimitive и иже с ним рисуют уже с учетом установленного стиля.
Видимо, если виджет совсем кастомный, то эти классы не помогут. Хз.


Название: Re: Box model и style sheets
Отправлено: andrew.k от Февраль 07, 2012, 23:52
Думаю тебе стоит читать этот (http://developer.qt.nokia.com/doc/qt-4.8/style-reference.html) не маленький раздел.

Вот у QStyle есть еще такая функция pixelMetric (http://developer.qt.nokia.com/doc/qt-4.8/qstyle.html#pixelMetric)
Первым параметром идет enum QStyle::PixelMetric
Цитировать
This enum describes the various available pixel metrics. A pixel metric is a style dependent size represented by a single pixel value

Кажется "оно!".


Название: Re: Box model и style sheets
Отправлено: xokc от Февраль 08, 2012, 00:00
drawPrimitive определяет где рисовать с помощью класса QRenderRule, имеющего в том числе вроде-бы нужные методы:
Код
C++ (Qt)
class QRenderRule
{
public:
   QRect borderRect(const QRect &r) const;
   QRect outlineRect(const QRect &r) const;
   QRect paddingRect(const QRect &r) const;
   QRect contentsRect(const QRect &r) const;
 

Но класс этот определен внутри qstylesheet.cpp и недоступен пользователю. Внутри же этих методов производятся манипуляции с рядом QSharedDataPointer<QStyleSheetBoxData> b, QSharedDataPointer<QStyleSheetBorderData> bd и т.п., которые вообще заполняются Бог знает где.


Название: Re: Box model и style sheets
Отправлено: andrew.k от Февраль 08, 2012, 00:24
Вот (http://stackoverflow.com/questions/1019510/custom-styles-for-custom-widgets-in-qt) твой случай.
Обрати внимание.
Warning: Qt style sheets are currently not supported for custom QStyle subclasses. We plan to address this in some future release.


Название: Re: Box model и style sheets
Отправлено: xokc от Февраль 08, 2012, 00:25
Думаю тебе стоит читать этот (http://developer.qt.nokia.com/doc/qt-4.8/style-reference.html) не маленький раздел.
Читал уже.

Вот у QStyle есть еще такая функция pixelMetric (http://developer.qt.nokia.com/doc/qt-4.8/qstyle.html#pixelMetric)
Первым параметром идет enum QStyle::PixelMetric
Цитировать
This enum describes the various available pixel metrics. A pixel metric is a style dependent size represented by a single pixel value
Кажется "оно!".

Нифига не оно. Только для бордер удается получить ширину если для всех сторон рамки она одинаковая (QStyle::PM_DefaultFrameWidth). Все остальные параметры скорее относятся к текущему QStyle, а не к конкретному QWidget с переопределенным stylesheet.


Название: Re: Box model и style sheets
Отправлено: xokc от Февраль 08, 2012, 00:29
Вот (http://stackoverflow.com/questions/1019510/custom-styles-for-custom-widgets-in-qt) твой случай.
Там несколько о другом речь идет. Программер хочет создавать нестандартные контролы и расширить синтаксис style sheet для них. Я же хочу совсем другого - понимать какие из параметров контрола изменены с помощью стандартного style sheet.


Название: Re: Box model и style sheets
Отправлено: andrew.k от Февраль 08, 2012, 00:33
Вот (http://stackoverflow.com/questions/1019510/custom-styles-for-custom-widgets-in-qt) твой случай.
Там несколько о другом речь идет. Программер хочет создавать нестандартные контролы и расширить синтаксис style sheet для них. Я же хочу совсем другого - понимать какие из параметров контрола изменены с помощью стандартного style sheet.
по-моему, оно и есть. суть одна:
I want to develop some custom controls that are not based entirely on existing drawing primitives and sub-controls. Since the entire application should be skinnable, I want to rely on custom styles, possible on style sheets as well.

Явно твой случай. А как вариант решения, он думал писать свои классы стилей.


Название: Re: Box model и style sheets
Отправлено: xokc от Февраль 08, 2012, 01:07
Явно не мой случай. Я готов использовать исключительно стандартные примитивы. Я не собираюсь делать мое приложение skinnable. Я только хочу понять в каком месте виджета мне рисовать эти примитивы, если в stylesheet указаны значения border, margin или spacing, но не могу понять как мне их получить.